我不明白我的bug中的逻辑在哪里,所以我设法找到了一个最小的例子。我定义了一个类t
,并说当你使用< =运算符并且> = b必须计算b< = a时会发生一些事情。
它工作正常
然后我从u
派生了一个子类t
。
当我比较两个值时,如果它们来自t
或来自u
两者,则它按预期工作,但如果一个来自类u
而另一个来自类t
它失败。 为什么 ??
class t :
def __le__(self,other) : return True
def __ge__(self,other) : return(other<=self)
class u(t) :
pass
a=t()
b=u()
#works
a<=a
a>=a
b<=b
b>=b
#works
a>=b
b<=a
#doesn't work RuntimeError: maximum recursion depth exceeded
a<=b
b>=a
编辑:python 2.x(来自tobias_k)没有问题,但我想至少使用python 3.3
答案 0 :(得分:6)
执行a <= b
并且b
是a
类的子类的实例时,Python将首先调用b.__ge__('a')
(然后尝试其他方法如果此调用返回NotImplemented
)
以下是如何在没有无限递归的情况下实现它:
>>> class t:
... def __le__(self, other):
... return True
... def __ge__(self, other):
... return NotImplemented
...
>>> class u(t):
... pass
...