一、自定義類
1、屬性與方法
格式:
class classname: def __init__(self,a,b): self.a=a self.b=b def ...
>一般都有一個__init__函式來定義屬於這個類的引數,前後都被"__"包圍的函式為特殊方法
;以"__"開頭的變數只能讀,不能寫,相當於private資料。
>如果重新實現str,repr等方法,值應使用表象形式:
def __str__(self): return "({0.a!r},{0.b!r})".format(self)
>如果呼叫一個類的方法,python就會自動在類樹中進行回溯,如果一直找不到就會產生一個AttributeError.
>在方法前加super()表示呼叫基類的方法,總是呼叫super().__init__()是一個種合理的做法。
>自定義類的所有例項都支援==,這種比較總是返回False,通過對特殊方法__eq__()進行重新實現,__ne__()也會跟著自動實現。
>如果我們希望避免不適當的比較,可以使用斷言(如:assert isinstance(other,Point));也可以用產生TypeError異常來宣告不支援這兩個物件的比較操作(如:if not isinstance(other,Point):raise TypeError());方法三:if not isinstance(other,Point):return NotImplem-emted,但只有在類只對比較特殊方法進行了重新實現才可能返回NotImplemented。
>isinstance()為內建的函式,以一個物件與一個類(或類構成的元組)為引數,如果物件屬於給定的類,或基類,就返回True。
>object提供的比較的特殊方法:__lt__(),__le__(),__eq__(),__ne__(),__ge__(),__gt__()。
2、繼承與多型
class classname2(classname): def __init__(self) ...
classname2是classname的繼承類。
多型:給定類的任意物件在使用時都可以看作該類的任意某個基類的物件。
3、使用特性進行屬性的存取控制
修飾器(decorator):是一個函式,該函式以一個函式或方法為引數,並返回引數“修飾後”版本。使用修飾器以@符號引導來進行標記。
例(用內建的property()函式對a的屬性進行修飾,使a必須為大於0的數):
@property def a(self): return self.__a @a.setter def a(self,a): assert a>0,"a must be nonzero and non-negative" self.__a=a
每個建立的特性都包含getter,setter,deleter等屬性。
4、建立完全整合的資料型別
對於不想要的來自於基類的方法,可以用raise Error的來取消這些方法的使用。對於要同時取消多個類的情況,可以藉助內建的exec()函式來實現,它會動態地執行從給定物件傳遞來的程式碼。
二、自定義組合類
組合型別的特殊方法:
__contains__(self,x) x in y __delitem__(self,k) del y[k] __getitem__(self,k) y[k] __iter__(self) for x in y :pass 返回序列中y中的項或對映y中鍵的迭代子 __len__(self) len(y) __reversed__(self) reversed(y) __setitem__(self,k,v) y[k]=v
對於賦值=後邊的值也可以用or,如果第一個值為False,則使用or後邊的值(a= b or 3)。