此问题在此处已有答案:
How can I avoid issues caused by Python's early-bound default parameters (e.g. mutable default arguments "remembering" old data)?(10个答案)
Why does a class' body get executed at definition time?(3个答案)
5年前关闭。
在__init__
中,有没有一种很酷的Python方法可以使用类字段(类变量)作为关键字参数的可变默认值?
下面是一个例子:
class Foo():
field = 5
def __init__(self, arg=field): # arg=Foo.field => name 'Foo' is not defined
self.arg = arg
# ok, let's start
obj_1 = Foo()
print(obj_1.arg) # 5, cool
# then I want to change Foo.field
Foo.field = 10
print(Foo.field) # 10, obviously
obj_2 = Foo()
print(obj_2.arg) # still 5, that's sad :(
为什么会这样呢?
我知道我可以这样做:
class Qux():
field = 5
def __init__(self, arg='default'):
self.arg = {True:Qux.field, False:arg}[arg == 'default']
Qux.field= 10
obj_3 = Qux()
print(obj_3.arg) # 10
但有没有更简单的方法呢?
先谢了。
1条答案
按热度按时间igetnqfo1#
只需将参数设置为
None
。然后测试参数是否为__init__
中的None
。如果是,则将其设置为默认值:上述逻辑也可以浓缩为: