Python學習_13_繼承和元類

來源:互聯網
上載者:User

標籤:

繼承

繼承的含義就是子類繼承父類的命名空間,子類中可以調用父類的屬性和方法,由於命名空間的尋找方式,當子類中定義和父類同名屬性或者方法時,子類的執行個體調用的是子類中的屬性,而不是父類,這就形成了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_繼承和元類

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.