2012-07-30 85 views
2

我已經寫了一個PHP應用程序,並有一個問題,我不能以一種很好的方式在PHP中解決。所以我正在考慮將它移植到Ruby或Python--我從未使用過的兩種語言。據我所見,這個問題可以在Ruby中解決,現在我的問題是如果我可以用Python解決它:在Python中創建面向原型的功能?

該應用程序的核心有一個我想要擴展的類A.有一個擴展E1通過doFoo方法擴展A,一個擴展E2通過方法doBar擴展A.現在我想使用這兩個擴展,而不必更改A,E1或E2的代碼。在PHP中,這可以通過編寫第三個擴展E3來存檔,該擴展提供了擴展A的B類,並將E1和E2與特徵或其他一些骯髒的技巧混合在一起。但我希望能夠擁有核心,擁有這兩個擴展,並在配置中擁有信息:「使用擴展E1和E2」,而不需要更多的類將所有內容放在一起(並且不使用__call() )。

在任何方式Python可能嗎?我並不需要可以在運行時更改的原型。 A的每個實例都應該有doFoo和doBar。

編輯:整個事情應該沒有擴展,只有E1(沒有E2),只有E2(沒有E1)和兩個擴展。

+1

我不確定我是否理解。爲什麼你不能使用簡單的繼承? – mgilson 2012-07-30 16:36:55

+0

啊,我忘了這個:E1也應該可以使用沒有E2和E2也應該可以使用沒有E2。謝謝。 – stofl 2012-07-30 16:46:06

+1

@stofl:你的意思是「E1」,對吧? – gahooa 2012-07-30 16:47:55

回答

2

正如mailson建議的那樣,多重繼承是最佳選擇。一個簡單的

class E(A, E1, E2): 
    ... 

應該做你需要的。

編輯: 要做到這一點動態,你可以使用類型:

E = type("E", (A, E1, E2), {}) 

EDIT2:杜格爾打我給它:d

+1

這將意味着(困難)編寫自定義類E,對吧?我不想編寫「啓用E1和E2」 - 我想配置它(沒有類似於E類代碼的自動生成)。 – stofl 2012-07-30 17:50:56

+0

非常感謝! – stofl 2012-07-30 18:34:51

1

你可以做建議的多重繼承沒有硬編碼是這樣的:

mixins = (E1, E2) 
E = type('E', (A,) + mixins, {}) 

這就好比做

class E(A, E1, E2): 
    pass 

但允許您動態指定mixin。

+0

謝謝。那很棒! – stofl 2012-07-30 18:34:24