我有两个类,一个主类创建另一个类的实例。
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
我遇到的问题与传递给attrs
类的Thing
字典有关。问题在于,每次我使用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']}
我的问题分为2部分:
为什么会这样?
我该如何解决?
答案 0 :(得分:3)
函数的可选参数被初始化一次。由于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)