Python (2.7) では、Fraction クラスの動作を (モジュール分数で) 模倣するが、__repr__ メソッドをオーバーライドして __str__ の結果と一致する有理数のクラスを作成したいと考えています。元のアイデアは、IDLE 出力をより使いやすくするために、私自身のいじくり回しのためだけのものでした。しかし今、私は、この特定のユースケースの回避策を得ることとは対照的に、根底にある継承/型付けの問題を理解することにもっと興味を持っています.
問題は、すべての数値演算子 (メソッド __add__、__sub__ など) の機能も継承したいのですが、結果が Fraction ではなくサブクラスのインスタンスになることです。それが私が望むことですが、代わりに、これが起こります:
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__ が好まれることを知っていますが、それらは基本クラスで定義されているため、私が興味を持っているメソッド呼び出しをキャッチしないようです!)
私が基本クラスの作成者ではないことを考えると、各メソッドを個別にオーバーライドするよりも良い方法はありますか?