【问题标题】:'super' object has no attribute '__eq__'“超级”对象没有属性“__eq__”
【发布时间】:2016-09-19 18:18:50
【问题描述】:

当我尝试重写魔术方法 __eq__ 并使用 super 访问在 object 中找到的基本方法时,出现错误。这不可能是一个错误,但它确实感觉像一个:

class A(object):
    def __eq__(self, other):
        return super(A, self).__eq__(other)
A() == 0

# raises AttributeError: 'super' object has no attribute '__eq__'

这是不直观的,因为 object.__eq__ 存在,但对于 class A(object): pass 它不存在。如果我没记错__eq__ 诉诸is 检查,那么这可能是这里的解决方法,但使用is 而不是super 对mixin 不友好。在我的情况下走那条路是可以的,但在其他情况下可能不是。

任何关于为什么__eq__ 以这种方式工作的建议或信息都会很棒。

【问题讨论】:

  • 该错误在 2.7 中出现,但在 3.5 中未出现
  • 不,object 不支持 instances 上的__eq__ ...尝试object().__eq__,它将引发AttributeError ...而不是object.__eq__ is (probably) a classmethod for checking if types are identical (eg object.__eq__(object)`)
  • @donkopotamus:这不会将您的对象与other 进行比较;它会将新创建的“空白”对象与other 进行比较。
  • @BrenBarn 我的意思是object().__eq__ 甚至不起作用,它会引发属性错误(已编辑以使其清晰)

标签: python python-2.7 super python-object


【解决方案1】:

正如 Will 的回答中所指出的,object() 实际上并没有为实例实现 __eq__(在 python 2.7 中)。

您被 object.__eq__ 存在的事实所欺骗,相信它必须是一个检查对象的 instances 是否相等的方法

相反,object.__eq__ 实际上是一个类方法,继承自 type,用于检查类型是否相等。

即处理object == intobject == object等表达式。

【讨论】:

    【解决方案2】:

    这是因为object() 实际上并没有实现__eq__()。这里的“默认”是:

    class A(object):
        def __eq__(self, other):
            if self is other:
                return True
    
            return self == other
    

    但是,如果您尝试的方法有效,您实际上将检查父类的self 实例是否等于other。而且,它是同一个对象 (self),所以它会。因此,与您的代码最接近的等价物实际上是:

    class A(object):
        def __eq__(self, other):
            if self is other:
                return True
    
            return super(A, self) == other
    

    【讨论】:

    • 正如我评论先前删除的答案,您的第二个示例不继承默认行为,因为如果您执行x = A(),则x == x 返回 False。 (您的第一个示例导致无限递归。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 2020-11-17
    • 1970-01-01
    • 2018-02-11
    • 2020-09-03
    相关资源
    最近更新 更多