Python namedtuple的相等重载

Python namedtuple的相等重载,python,namedtuple,Python,Namedtuple,对于python中的namedtuple,有没有办法重载相等运算符\uuuuuueq\uuuuu(self,other) 我知道这在类和重新定义方法中是可能的,但是对于一个namedtuple也是可能的,你将如何实现它?据我所知,你不能修补\uuuuueq\uuuuu,但是你可以将namedtuple子类化,并以你喜欢的方式实现它。例如: from collections import namedtuple class Demo(namedtuple('Demo', 'foo')):

对于python中的
namedtuple
,有没有办法重载相等运算符
\uuuuuueq\uuuuu(self,other)


我知道这在类和重新定义方法中是可能的,但是对于一个
namedtuple
也是可能的,你将如何实现它?

据我所知,你不能修补
\uuuuueq\uuuuu
,但是你可以将
namedtuple子类化,并以你喜欢的方式实现它。例如:

from collections import namedtuple

class Demo(namedtuple('Demo', 'foo')):

    def __eq__(self, other):
        return self.foo == other.foo
from typing import NamedTuple

class A(NamedTuple):
    x:str
    y:str
    def __eq__(self,other):
        return self.x == other.x

print(A('a','b') == A('a','c'))
使用中:

>>> d1 = Demo(1)
>>> d2 = Demo(1)
>>> d1 is d2
False
>>> d1 == d2
True

我认为,考虑到namedtuple的公共API,不重写就不可能做到这一点。最短的解决办法是:

class Person(namedtuple('Person', ['ssn', 'name'])):
    def __eq__(self, other):
        return self.ssn == other.ssn
>>> Person = namedtuple('Person', ['ssn', 'name'])
>>> Person.__eq__ = lambda x, y: x.ssn == y.ssn
--

另一种选择是:

class Person(namedtuple('Person', ['ssn', 'name'])):
    def __eq__(self, other):
        return self.ssn == other.ssn
>>> Person = namedtuple('Person', ['ssn', 'name'])
>>> Person.__eq__ = lambda x, y: x.ssn == y.ssn

使用新的Namedtuple类,从输入中分离出来是可能的。它适用于我的Python3.6,但也适用于前面的示例

例如:

from collections import namedtuple

class Demo(namedtuple('Demo', 'foo')):

    def __eq__(self, other):
        return self.foo == other.foo
from typing import NamedTuple

class A(NamedTuple):
    x:str
    y:str
    def __eq__(self,other):
        return self.x == other.x

print(A('a','b') == A('a','c'))