有没有办法在python中为__eq__(self, other)
重载等于运算符namedtuple
?
我知道这可以在类中重新定义方法,但这对namedtuple
也是可行的,你会如何实现呢?
答案 0 :(得分:10)
我认为,鉴于namedtuple的公共API,如果不覆盖,就不可能做到这一点。最短的解决方案是:
class Person(namedtuple('Person', ['ssn', 'name'])):
def __eq__(self, other):
return self.ssn == other.ssn
-
>>> p1 = Person("123", "Ozgur")
>>> p2 = Person("123", "EVR")
>>> print p1 == p2
True
另一种选择是:
>>> Person = namedtuple('Person', ['ssn', 'name'])
>>> Person.__eq__ = lambda x, y: x.ssn == y.ssn
答案 1 :(得分:5)
据我所知,您无法修补__eq__
,但您可以将namedtuple
子类化并按照您喜欢的方式实现它。例如:
from collections import namedtuple
class Demo(namedtuple('Demo', 'foo')):
def __eq__(self, other):
return self.foo == other.foo
使用中:
>>> d1 = Demo(1)
>>> d2 = Demo(1)
>>> d1 is d2
False
>>> d1 == d2
True
答案 2 :(得分:1)
使用新的Namedtuple类进行输入是可能的。它适用于python 3.6,但也适用于前面的例子。
例如:
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'))