在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)
Run Code Online (Sandbox Code Playgroud)
发生这种情况是因为Fraction中定义的运算符返回Fraction实例。当然,我可以单独重写所有这些魔术方法,调用父类进行数学运算然后强制转换为我的类型,但是我觉得应该有一种方法可以通用地处理这种重复情况(即,无需编写“ def” 20次)。
我还考虑过使用__getattribute__来拦截方法调用,但这似乎不雅致,极其脆弱,并且可以保证在甚至比此复杂得多的情况下失败。(我知道__getattr__是首选,但似乎不会捕获我感兴趣的方法调用,因为它们是在基类中定义的!)
鉴于我不是基类的作者,是否有比单独覆盖每个方法更好的方法?