Python:子类化元组和运算符

Jes*_*cia 2 python oop tuples subclass operators

我是元组的子类.我想覆盖相等的方法.它似乎没有工作.这是我最小的工作示例:

class OPS(tuple): 
    def __new__(self, data):
        self=tuple(data)
        return self

    def __eq__(A,B):
        print 'Hi'
        return True

O1=OPS([1,2,3])
O2=OPS([1,2,4])
O1==O2
Run Code Online (Sandbox Code Playgroud)

它返回False,当它应该打印'Hi',然后再返回True.关于我做错了什么的任何想法?我打赌它很愚蠢,但我很茫然.

Blc*_*ght 6

问题在于您的__new__方法是创建对象.您正在返回常规tuple实例,而不是子类的实例,因此__eq__您永远不会调用您编写的方法.

尝试更改__new__为:

def __new__(cls, data):
    self = super(OPS, cls).__new__(cls, data)
    return self
Run Code Online (Sandbox Code Playgroud)

self此版本返回的值将是一个OPS实例.


小智 5

您正在返回tuple实例__new__,而不是实例OPS.但是,__new__在这种情况下,您可以跳过覆盖,因为您没有更改输入参数(在这种情况下__new__,由于tuple是不可变类型,因此需要).这按预期工作,例如:

class OPS(tuple):
    def __eq__(self, other):
        return True

o1 = OPS([1,2,3])
o2 = OPS([1,2,4])

print o1 == o2
Run Code Online (Sandbox Code Playgroud)