標籤:
繼承
繼承的含義就是子類繼承父類的命名空間,子類中可以調用父類的屬性和方法,由於命名空間的尋找方式,當子類中定義和父類同名屬性或者方法時,子類的執行個體調用的是子類中的屬性,而不是父類,這就形成了python中的多態:
def SuperClass:
? ? def a_method:
? ? ? ? pass
def SubClass(SuperClass):
? ? def a_method:
? ? ? ? pass
obj = SubClass()
obj.a_method()
當obj調用一個方法時,先從a對象本身局部命名空間尋找,然後到SubClass中尋找,然後才到SuperClass中尋找,任何一處找到該屬性都會終止尋找過程,所以上例中obj調用的a_method屬於SubClass中的方法。再次看到python中的對象各種關係,其實都是命名空間的關係。?
Python同時支援多重繼承,一個類可以繼承自多個父類,而在多重繼承的關係中,屬性的尋找方式是廣度優先搜尋(最開始是深度優先),即會從每個父類中按順序搜尋,如果沒有找到則到第一個父類的所有父類中按順序搜尋,然後是第二個父類的所有父類,接著是第一個父類的第一個父類的所有父類。。。。。。這樣的尋找方式好處是,總是會從第一級的類中繼承屬性,實際尋找的時候一定要注意到順序的問題。
元類
如果說類是建立執行個體的模板,那麼元類就是建立類的模板,區別元類和父類的不同,元類只是定義了類的構造方法:__new__方法,如果沒有指定元類,則從預設元類type中調用該方法:
class ListMetaclass(type):
? ? def __new__(cls, name, bases, attrs):?
? ? ? ? attrs[‘add‘] = lambda self, value: self.append(value)
? ? ? ? return type.__new__(cls, name, bases, attrs)
class MyList(list,metaclass=ListMetaclass):
? ? pass
print(ListMetaclass.__class__)
和類使用工廠函數來執行個體化對象不同的是,通過在類定義中使用metaclass來指明元類。通過__new__構造器方法,對MyList添加add屬性,所以在ListMetaclass中並沒有add屬性。元類的本質是類,只是定義了特殊__new__方法的類。
Python學習_13_繼承和元類