我有一个 Parent 和多个 Children 类。每个 Child 类都有一个空的 template ,其中包含有关该类结构的信息。
Parent类包含方法Parent.overwrite_key
:基本上,它所做的是覆盖dict
中的给定密钥。该方法是递归的,因此对于嵌套字典,可以将参数key
设置为列表,然后该方法将通过嵌套结构。
创建Parent.__init__
方法,以便在子级中可以传递参数来填充模板,例如
Children(Beta='hello', Alpha__field1__content = 'Something')
在这里我使用双下划线来分隔字段。
这是我的代码
class Parent(object):
def __init__(self, **kwargs):
self.data = self.template.copy()
for key,val in kwargs.items():
key=key.split('__')
Parent.overwrite_key(dic = self.data, key=key, val=val)
@staticmethod
def overwrite_key(dic, key, val, num=0):
tmp_dic = dic
if isinstance(key, list) and len(key) > 1:
tmp_dic = tmp_dic[key[0]]
if isinstance(tmp_dic, list):
tmp_dic = tmp_dic[0]
key = key[1:]
Parent.overwrite_key(tmp_dic, key, val)
elif isinstance(key, list) and len(key) is 1:
key = key[0]
tmp_dic[key] = val
return
elif isinstance(key, str):
tmp_dic[key] = val
return
class Child(Parent):
template = {
"Alpha": [
{
"field1": {
"content": "",
"source": ""
}
}
],
"Beta": "",
"Gamma": [
""
]
}
我的问题是,在使用一些输入参数定义Child的实例时,这似乎会覆盖Children.template
。参见:
print(Child.template)
c = Child(Alpha__field1__content = 'Something')
print(c.data)
print(Child.template)
# returns the following
{'Alpha': [{'field1': {'content': '', 'source': ''}}], 'Gamma': [''], 'Beta': ''}
{'Alpha': [{'field1': {'content': 'Something', 'source': ''}}], 'Gamma': [''], 'Beta': ''}
{'Alpha': [{'field1': {'content': 'Something', 'source': ''}}], 'Gamma': [''], 'Beta': ''}