我有两个类,一个主类创建另一个类的实例。
class Builder:
def __init__(self, id):
self.id = id
def build_thing(self, main_ftr, main_attr, attrs = {}):
# note the main ftr/attrs gets added to attrs no matter what
attrs[main_ftr] = attrs.get(main_ftr, []) + [main_attr]
return Thing(main_ftr, main_attr, attrs)
class Thing:
def __init__(self, main_ftr, main_attr, attrs):
self.main_ftr = main_ftr
self.main_attr = main_attr
self.attrs = attrs
我遇到的问题与传递给 Thing
类的 attrs
字典有关。问题是,每次我使用 Builder 类创建 Thing 类时,attrs 参数都会保留其之前的值
b = Builder('123')
t = b.build_thing('name', 'john')
print(t.attrs) # {'name': ['john'] }
# Goal is this creates a new "Thing" with only attrs = {'name':['mike']}
t2 = b.build_thing('name', 'mike')
print(t2.attrs) # {'name': ['john', 'mike']}
我的问题分为两部分:
为什么会发生这种情况?
如何修复它?
最佳答案
函数的可选参数被初始化一次。由于 attrs
是可变的,因此每次调用该函数时,都会向此字典添加新的键值对,并保留该字典以供进一步调用。如果您需要可变数据结构作为默认参数,请使用类似以下内容的内容:
def build_thing(self, main_ftr, main_attr, attrs=None):
if attrs is None:
attrs = {}
attrs[main_ftr] = attrs.get(main_ftr, []) + [main_attr]
return Thing(main_ftr, main_attr, attrs)
关于python OOP 类方法保留变量。奇怪的范围界定事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51969610/