在Python(2.7)中,我想創建一個有理數字類,它模仿Fraction類(在模塊分數中)的行爲,但是會覆蓋__repr__方法來匹配__str__的結果。最初的想法只是爲了我自己的修補,並且爲了讓IDLE輸出看起來更友好。但是現在我更感興趣的是理解潛在的繼承/打字問題 - 我認爲這可能是普遍感興趣的 - 而不是爲這個特定的用例找到解決方法,這是毫無意義的。Python:我可以爲超類中定義的運算符創建自己類型的子類返回實例嗎?
問題是,我想繼承所有數值運算符(方法__add__,__sub__等)的功能,但結果是我的子類的實例而不是分數的實例。這就是我想要的,但相反,發生這種情況:
class Q(Fraction):
def __repr__(self):
return str(self)
>>> Q(1,2)
1/2
>>> Q(1,2) + Q(1,3)
Fraction(5, 6)
發生這種情況是因爲在Fraction返回Fraction實例中定義的運算符。當然,我可以單獨重寫所有這些魔術方法,調用父類來進行數學運算,然後強制我的類型,但我覺得應該有一種方法來處理這種一般性的重複情況(即不寫「def」20次)。
我也考慮過使用__getattribute__來攔截方法調用,但是這看起來不夠雅緻,非常脆弱,並且幾乎保證在比這個更復雜的情況下失敗。 (我知道__getattr__是首選,但似乎不會捕獲我感興趣的方法調用,因爲它們是在基類中定義的!)
鑑於我不是基類的作者,是否有比單獨覆蓋每種方法更好的方法?
不幸的是,你必須定義所有的魔法方法。 ('__geattribute__'將不起作用,它不會捕獲神奇方法的魔法調用。)但是,您可以使用[這裏]描述的方法(http://stackoverflow.com/questions/9057669/how-can-i -intercept-calls-to-pythons-magic-methods-in-new-style-classes)自動創建這樣的方法。基本上,你編寫了一個元類,它自動定義了調用基類魔術方法的神奇方法,並將結果包裝在派生類中。 – BrenBarn
所以主要的問題是你的基類'Fraction'沒有很好的繼承設計。如果是的話,它會使用'type(self)(...)'來創建它返回的對象(或者它顯示的repr-strings)。不幸的是,這意味着它會讓你的生活變得更難 – shx2