代码之家  ›  专栏  ›  技术社区  ›  Terence Chow

在实例化期间递归地创建相同的类

  •  0
  • Terence Chow  · 技术社区  · 6 年前

    我有一个JSON配置,我想从中创建一个dict。因为JSON配置是递归的,所以每当我看到JSON值是一个数组时,我都要递归地迭代它。但这并不是我想做的。

    class FieldHandler():
        formfields = {}
    
        def __init__(self, fields):
            for field in fields:
                options = self.get_options(field)
                f = getattr(self, "create_field_for_" +
                            field['type'])(field, options)
                self.formfields[field['name']] = f
    
        def get_options(self, field):
            options = {}
            options['label'] = field['name']
            options['help_text'] = field.get("help_text", None)
            options['required'] = bool(field.get("required", 0))
            return options
    
        def create_field_for_string(self, field, options):
            options['max_length'] = int(field.get("max_length", "20"))
            return django.forms.CharField(**options)
    
        def create_field_for_int(self, field, options):
                options['max_value'] = int(field.get("max_value", "999999999"))
                options['min_value'] = int(field.get("min_value", "-999999999"))
                return django.forms.IntegerField(**options)
    
        def create_field_for_array(self, field, options):
                fh = FieldHandler(field['elements'])
                return fh
    

    并实例化:

    fh = FieldHandler([
        {'type': 'string', 'name': 'position'}, 
        {'type': 'array', 'name': 'calendar', 'elements': [
            {'type': 'string', 'name': 'country'},    
            {'type': 'string', 'name': 'url'},
        ]},
        {'type': 'int', 'name': 'maxSize'}
    ])
    

    我希望得到这样的口述:

    {
       'position': <django.forms.fields.CharField object at 0x10b57af50>, 
       'calendar': <__main__.FieldHandler instance at 0x10b57c680>, 
       'maxSize': <django.forms.fields.IntegerField object at 0x10b58e050>, 
    }
    

    如果日历本身预期为:

    {
       'url': <django.forms.fields.CharField object at 0x10b58e150>, 
       'country': <django.forms.fields.CharField object at 0x10b58e0d0>
    }
    

    相反,我得到:

    {
       'url': <django.forms.fields.CharField object at 0x10b58e150>, 
       'position': <django.forms.fields.CharField object at 0x10b57af50>, 
       'calendar': <__main__.FieldHandler instance at 0x10b57c680>, 
       'maxSize': <django.forms.fields.IntegerField object at 0x10b58e050>, 
       'country': <django.forms.fields.CharField object at 0x10b58e0d0>
    }
    

    我做错什么了?为什么是 position country 正在全局设置参数 FieldHandler ?

    1 回复  |  直到 6 年前
        1
  •  0
  •   user2390182    6 年前

    formfields 是在所有实例之间共享的类属性。改为实例属性:

    class FieldHandler():
    
        def __init__(self, fields):
            self.formfields = {}
            # ...
    

    现在,全部 FieldHandler 实例有自己的 窗体域 ,只有“内部”日历处理程序具有 country url (不是) position 假设这是一个打字错误的字段。