namedtuple

时间:2016-01-02 21:15:30

标签: python namedtuple

有没有办法在python中为__eq__(self, other)重载等于运算符namedtuple

我知道这可以在类中重新定义方法,但这对namedtuple也是可行的,你会如何实现呢?

3 个答案:

答案 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'))