2010-09-01 23 views
0

我寫了一個mixin類,它被設計爲在新式類之上分層,例如通過如何將「mixin」類應用於舊式基類

class MixedClass(MixinClass, BaseClass): 
    pass 

將這個mixin應用到舊式類的最流暢的方法是什麼?它在__init__方法中使用了對super的調用,所以這可能會(?)必須改變,但是否則我想盡可能少地改變MixinClass。我應該能夠派生出一個進行必要更改的子類。

我正在考慮在源自BaseClass的類之上使用類裝飾器,例如

@old_style_mix(MixinOldSchoolRemix) 
class MixedWithOldStyleClass(OldStyleClass) 

其中MixinOldSchoolRemix是從MixinClass派生而來的,只是重新實現了使用super的方法,而是使用包含與之混合的類的類變量,在本例中爲OldStyleClass。該類變量將由old_style_mix設置爲混合過程的一部分。

old_style_mix只會更新例如類字典。 MixedWithOldStyleClass包含mixin類(例如MixinOldSchoolRemix)字典的內容。

這是一個合理的策略嗎?有沒有更好的辦法?看起來這是一個常見的問題,因爲有許多可用的模塊仍在使用舊式類。

+0

我是脫節的建議轉換舊風格類到新風格類? – aaronasterling 2010-09-01 03:28:32

+0

@aaronasterling:如果我可以使它在標準庫的所有安裝中追溯更新,我肯定會這樣做。 – intuited 2010-09-01 03:59:45

回答

2

此類變量將通過 old_style_mix作爲混合 過程的一部分來設置。

......我認爲你的意思是:「......在課堂上裝修......」而不是「以班級爲論據」(後者將是一場災難)。

old_style_mix將只更新 類字典,例如, MixedWithOldStyleClass與mixin類的 內容(例如 MixinOldSchoolRemix)字典。

沒有好 - 這MixinOldSchoolRemixMixinClass導出的信息,例如,是不是前的字典。所以,old_style_mix必須採取不同的策略:例如,建立一個新的類(我相信這是一個新的風格的一個,因爲舊式的人做接受新的風格的人作爲__bases__)與相應的序列的基地,以及適當調整的字典。

這是一個合理的策略?

隨着以上附帶條件。

看起來這將是一個常見的問題 ,因爲仍然有使用 老式類衆多 可用的模塊。

...但類混入未曾被設計採取混入肯定常見的設計模式,所以這個問題是不常見的,在所有的(我不記得看到它,即使在一次自新課程誕生多年以來,我在那些年中積極諮詢,教授高級課程並幫助人們解決Python問題,並且自己做了大量的軟件開發 - 我確實傾向於遇到了人們可能遇到的任何「相當普遍」的問題,而這些問題已經足夠長了!)。

下面是你的類裝飾可以做的示例代碼(如果你喜歡有它在一個類的裝飾,而不是直接內嵌...):

>>> class Mixo(object): 
... def foo(self): 
...  print 'Mixo.foo' 
...  self.thesuper.foo(self) 
... 
>>> class Old: 
... def foo(self): 
...  print 'Old.foo' 
... 
>>> class Mixed(Mixo, Old): 
... thesuper = Old 
... 
>>> m = Mixed() 
>>> m.foo() 
Mixo.foo 
Old.foo 

如果你想建立Mixed下的假設在您的修飾器中輸入Mixo的名稱/綁定,您可以通過撥打type或設置Mixed.__name__ = cls.__name__(其中cls是您正在裝飾的類別)來完成。我認爲後一種方法更簡單(警告,未經測試的代碼 - 上面的交互shell會話是一個真實的,但我沒有測試過下面的代碼):

def oldstylemix(mixin): 
    def makemix(cls): 
     class Mixed(mixin, cls): 
      thesuper = cls 
     Mixed.__name__ = cls.__name__ 
     return Mixed 
    return makemix 
相關問題