2018年4月29日 星期日

Python筆記:物件與類別

類別

__init__(self)是在Python中的類別建構子(class constructor,就像C++中和類別同名的成員函式),其中self參數代表正在被建構的物件本身。此方法並非必要

繼承

在Python中,父類別又稱為parent, superclass, base class,子類別又稱為child, subclass, derived class。以下範例可以看到Yugo繼承Car,及複寫Car的成員方法。

當我們想要在子類別中呼叫父類別的函式時,我們可以在函式名稱前加上super()。如果子類別需要定義新的作法,但是又需要父類別的作法時,使用super()可以確保子類別沒有重複的程式碼,且當父類別定義被更動時,我們不需要更改子類別就能反應其改變。

特性(property)

特性可以作為用來裝飾物件屬性(attibute)的介面,有兩種方式可以使用它:
1. 先定義getter, setter之後,把property(getter, [setter])指派給該屬性。
2. 用裝飾器,@property放在getter之前,@attibute.setter放在setter之前。
如果沒有藉由特性的以上兩個方法來指定setter給某屬性的話,就無法直接改變該屬性,這對於唯讀的屬性來說很方便。注意到getter是必要的,如果沒有getter的話會無法編譯程式。

用__attibuteName來隱藏屬性

在屬性前面加上雙底線可以建立"表面上"只有類別定義域內可以存取的屬性(因為如果我們用該屬性名稱或是加了雙底限的屬性名稱去存取會找不到該屬性),但如果真的要從外部存取的話,可以用_ClassName__attibuteName。

方法類型

除了實例方法(在方法的第一個參數使用self的方法)之外,還有類別方法(在方法的第一個參數使用cls),並且在方法宣告前一行要加上@classmethod。類別方法會共通於所有的實例。通常會用來紀錄關於類型的資訊(類型各物件的數量、類型的狀態等等)。另外還有靜態方法,以@staticmethod開頭,這種方法是唯一不需要帶入任何參數的方法,通常用來處理屬於該類別相當一般化的工作。由於其靜態的特性,呼叫它甚至不需要建立物件。

重載運算子(Operator overloading)

Python中,如果我們的自定義類別需要重載運算子,可以定義以下函數(僅列出部份):
__eq__(self, other)    self == other
__ne__(self, other)    self != other
__lt__(self, other)      self < other
__gt__(self, other)     self > other
__le__(self, other)     self <= other
__ge__(self, other)    self >= other
__add__(self, other) self + other
__str__(self)   print(str())
__repr__(self)   object


沒有留言:

張貼留言