小编PyP*_*rog的帖子

如何在Python中处理__eq__以及按什么顺序处理?

由于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__功能.只是寻找官方的决策树.

python comparison user-defined

76
推荐指数
3
解决办法
9万
查看次数

第一次调用时list(y)行为是"错误的"

我有一个__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)

python iterator list

1
推荐指数
1
解决办法
202
查看次数

标签 统计

python ×2

comparison ×1

iterator ×1

list ×1

user-defined ×1