当前位置: 首页 > 知识库问答 >
问题:

在Python中是否可以覆盖名称元组中的方法?

万高洁
2023-03-14

假设我有一个这样的类:

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

当然,我正努力让“我的f1”出版。我也希望f1是可选的。这是怎么回事?有没有可能在namedtuple中定义一个方法的默认实现,然后在new中重写它?

共有2个答案

邵献
2023-03-14

避免在< code >类Foo中声明< code>f1。相反,应在模块级别声明它,并将其用作namedtuple的默认参数:

def f1():
    print('Default f1')

Foo = namedtuple('Foo', 'f1')
Foo.__new__.__defaults__ = (f1,)

用法:

>>> foo = Foo()
>>> foo.f1()
Default f1

>>> def other_f1():
...     print('Another f1')
>>> foo = Foo(f1=other_f1)
>>> foo.f1()
Another f1
爱炯
2023-03-14

方法和插槽不能使用相同的名称。命名元组使用槽,这些槽在与方法相同的命名空间中作为< code>property对象实现。通过定义方法< code>f1,您破坏了< code>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>

属性对象只是返回self[0]。因此,要么按位置访问f1值:

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

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

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
 类似资料:
  • 问题内容: 在Java中是否可以覆盖Objects数组的toString? 例如,假设我创建了一个简单的类(由于这是一个普遍的问题,所以实际上是哪个类并不重要)。客户端一旦创建了一个数组并使用了它,是否有可能不打印该数组的地址,而是打印一个定制的? PS:当然,我不能只在类中重写它,因为它与单个实例有关。 问题答案: 不会。您当然可以创建一个静态方法User.toString(User []),但

  • 问题内容: 假设有一个文件夹“ / home / user / temp/a40bd22344”。名称是完全随机的,并且在每次迭代中都会更改。我需要能够使用固定名称(例如“ project”)在Python中导入此文件夹。我知道我可以将此文件夹添加到sys.path中以启用导入查找,但是有没有一种方法可以将“a40bd22344”替换为“项目”? 也许 init .py有一些聪明的技巧? 添加:

  • 问题内容: 你能 声明这样 的函数吗? 然后像这样 重新声明 它… 这样可以覆盖函数吗? 可以吗 问题答案: 编辑 解决此答案未直接解决原始问题的评论。如果您是通过Google搜索到达的,请从此处开始 有一个名为override_function的函数可以实际使用。但是,由于此函数是Advanced PHP Debugger扩展的一部分,因此很难为生产使用提供参数。因此,我要说“否”,不可能以原始

  • 在这个特定的示例中,我扩展了

  • 问题内容: 是否可以在Python中覆盖+ =? 问题答案: 是的,重写该方法。例:

  • 问题内容: 我有一堂课,有以下领域。这些属性用于在需要调用外部rest API方法时序列化为json对象。 在属性名称中,外部API服务调用需要一些类似json归档名称格式的内容。 就我而言,这可以根据诸如test,dev和prod之类的环境进行更改。因此,我正在寻找一种将listId值移动到app.config中的方法。 我尝试按照以下方式进行操作,但不允许这样做。如果分配常数值,它将起作用。