Python3 物件導向程式設計(類)

覆手為雲p發表於2017-06-14

 

一、自定義類

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)。

 

相關文章