Python namedtuple的相等重载
对于python中的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')):
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'))