python - 是否可以在Python中重写namedtuple中的方法?

标签 python overriding namedtuple

假设我有一个这样的类(class):

class Foo(namedtuple('Foo', ['f1'])):
    def f1(self):
        print('Default f1')

    def __new__(cls, f1=f1):
        return super().__new__(cls, f1)

假设我稍后创建了一个 Foo 对象并选择覆盖 f1 的方法定义,如下所示:

def my_f1():
    print("My f1")

foo = Foo(f1=my_f1)

如果我然后尝试:

foo.f1()

我得到:

Default f1

当然,我正在尝试打印“My f1”。我还希望 f1 是可选的。这里发生了什么?是否可以在namedtuple中定义方法的默认实现,然后在new中覆盖它?

最佳答案

不能让方法和槽同时使用相同的名称。命名元组使用 slots ,并且它们作为 property 对象实现,与方法位于同一命名空间。通过定义方法 f1,您破坏了 f1 属性:

>>> from collections import namedtuple
>>> namedtuple('Foo', ['f1']).f1
<property object at 0x1069764c8>
>>> class Foo(namedtuple('Foo', ['f1'])):
...     def f1(self):
...         print('Default f1')
... 
>>> Foo.f1
<unbound method Foo.f1>

property 对象仅返回self[0]。因此,要么按位置访问 f1 值:

class Foo(namedtuple('Foo', ['f1'])):
    def f1(self):
        if self[0]:
            return self[0]()
        print('Default f1')

或者给你的属性一个不同的名称,并让f1方法委托(delegate)给它:

class Foo(namedtuple('Foo', ['f1_callable'])):
    def f1(self):
        if self.f1_callable:
            return self.f1_callable()
        print('Default f1')

演示:

>>> def my_f1():
...     print("My f1")
... 
>>> class Foo(namedtuple('Foo', ['f1'])):
...     def f1(self):
...         if self[0]:
...             return self[0]()
...         print('Default f1')
... 
>>> foo = Foo(my_f1)
>>> foo.f1()
My f1
>>> foo = Foo(None)
>>> foo.f1()
Default f1

关于python - 是否可以在Python中重写namedtuple中的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32785448/

相关文章:

java - 编译器不喜欢重写

java - 如何在java类文件中动态覆盖静态代码块

python - Python 中的 "named tuples"是什么?

python - 为什么 Python 不支持记录类型? (即可变的命名元组)

python项目导入uwsgi如何进行单元测试?

python - 传递带有指向 ctypes 中其他结构的指针的结构

python - 如何获取有关我的 OperationalError 是什么的更多信息

python - Pandas 按组删除前导零值

overriding - 如何子类化 CCMenuItemImage

python - 为什么 namedtuple._as_dict() 比使用 dict() 转换慢