假设我有一个这样的类:
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中重写它?
避免在< 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
方法和插槽不能使用相同的名称。命名元组使用槽,这些槽在与方法相同的命名空间中作为< 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中的方法。 我尝试按照以下方式进行操作,但不允许这样做。如果分配常数值,它将起作用。