创建实例覆盖类对象

时间:2019-04-16 18:48:44

标签: python

我有一个 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': ''}

0 个答案:

没有答案