由于Python不提供其比较运算符的左/右版本,它如何决定调用哪个函数?
class A(object):
def __eq__(self, other):
print "A __eq__ called"
return self.value == other
class B(object):
def __eq__(self, other):
print "B __eq__ called"
return self.value == other
>>> a = A()
>>> a.value = 3
>>> b = B()
>>> b.value = 4
>>> a == b
"A __eq__ called"
"B __eq__ called"
False
Run Code Online (Sandbox Code Playgroud)
这似乎称为两种__eq__
功能.只是寻找官方的决策树.
我有一个__len__
定义了方法的迭代器.问题:
如果调用list(y)并且y __len__
定义了一个方法,则__len__
调用它.
1)为什么?
在我的输出中,您将在第一次尝试时看到len(list(y))为0.如果查看列表输出,您将看到在第一次调用时,我收到一个空列表,在第二次调用时,我收到"正确"列表.
2)为什么它会返回一个长度为零的列表?
3)为什么列表长度在所有后续呼叫中都是正确的?
另请注意,调用"枚举"不是问题.C类做同样的事情,但使用while循环并调用next().
码:
showcalls = False
class A(object):
_length = None
def __iter__(self):
if showcalls:
print "iter"
self.i = 0
return self
def next(self):
if showcalls:
print "next"
i = self.i + 1
self.i = i
if i > 2:
raise StopIteration
else:
return i
class B(A):
def __len__(self):
if showcalls:
print "len"
if self._length is None:
for i,x in enumerate(self):
pass
self._length = i
return …
Run Code Online (Sandbox Code Playgroud)