支援協作多繼承

2021-09-02 06:04:10 字數 2009 閱讀 4643

本節不是關於來自多個qt類的子類。

協作多繼承是一種用於實現繼承多個超類的類的技術 - 通常是主超類和乙個或多個新增其他行為的mixin類。它可以在以後新增新的mixin以便進一步擴充套件行為,而無需更改類的實現或建立類例項的任何現有**。

該技術要求所有超類的__init__方法遵循相同的模式,處理無法識別的關鍵字引數,並用於super()呼叫自己的超類__init__方法。

pyqt5的類遵循這種模式。

看raymond hettinger的python超級()被認為超級!關於這個主題的一些更多背景的部落格文章。

舉個例子,假設我們有乙個代表乙個人的類,乙個人有乙個名字。以下可能是初始實現:

class person(qobject):

def __init__(self, name, parent=none)

qobject.__init__(self, parent)

self.name = name

通常可以通過以下方式之一建立例項:

person = person("joe")

person = person("joe", some_parent)

這種方法有一些侷限性:

考慮這個替代實現:

class person(qobject):

def __init__(self, name, **kwds):

super().__init__(**kwds)

self.name = name

不同之處在於我們只處理person類本身使用的引數,並通過呼叫將所有其他引數歸入超類super()

通過此實現,通常可以通過以下方式之一建立例項:

person = person("joe")

person = person("joe", parent=some_parent)

這裡的區別在於我們使用關鍵字引數來指定person類本身未處理的任何引數。請注意,我們可以為所有引數使用關鍵字引數 - 無論您是否這樣做都取決於個人選擇。

第一次實施的限制不再適用。例如,如果沒有任何進一步的更改,我們也可以這樣做:

person = person("joe", destroyed=some_callable)
假設我們現在想person通過新增乙個處理乙個人年齡的mixin 來擴充套件類的行為。mixin的實現如下:

class age(object):

def __init__(self, age=0, **kwds):

super().__init__(**kwds)

self.age = age

這遵循與我們的person實現類似的模式,但請注意我們為age引數提供了預設值。

以下是我們的新person實現:

class person(qobject, age):

def __init__(self, name, **kwds):

super().__init__(**kwds)

self.name = name

我們必須做的唯一改變就是新增ageperson超類的列表中。更重要的是,我們不需要更改任何呼叫來建立person例項。

如果我們確實想要建立乙個person非預設年齡的例項,那麼我們只需將其作為關鍵字引數傳遞,如下所示:

person = person("joe", age=38)
這種技術增加了關鍵字引數的使用 - 雖然這意味著更多的輸入,但它顯著增加了應用程式**的可讀性。

Python支援多重繼承嗎?

繼承是物件導向程式設計的乙個重要方式,通過繼承,子類可以擴充套件父類的功能,python也具有該特性,除此之外,python還可以使用多重繼承。語法 class subclass base1,base2 1.繼承只會繼承父類的方法,不能繼承父類的變數 2.要想繼承父類的變數,需要執行父類的 init...

團隊工具 團隊協作工具哪些支援多人共享高效辦公?

不論您是每天在辦公室內忙得焦頭爛額的底層員工,還是每天負責整理產品相關的產品經理,或者是被領導各種催催催加急趕工的設計師.不論您在職場中是什麼身份,從事的哪種工作,只要您在職場中,就要懂得優勝劣汰的規則,能力強的人終究會被領導和上司認可。而在職場工作中,乙個人的單打獨鬥注定會失敗,只有和團隊凝聚一心...

下面的模型支援多重繼承嗎?

這是書本 uml物件導向建模與設計 p68 4.10 7 上的乙個習題,題目為 圖描述泛化的部分元模型 上邊的那個類模型圖 泛化會與多個泛化角色相互關聯,這裡的角色指類在泛化中扮演的角色,角色型別要麼是子類,要麼是父類,這個模型是否支援多重繼承,解釋您的答案。答案 不支援多重繼承,對於參加各種泛化的...