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

2024-10-04 01:34:07 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我做错了什么?为什么在我的全局FieldHandler上设置positioncountry参数


Tags: djangonameselffieldfieldsforgetobject
1条回答
网友
1楼 · 发布于 2024-10-04 01:34:07

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

class FieldHandler():

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

现在,所有FieldHandler实例都有自己的formfields,只有“内部”日历处理程序有countryurl(而不是position字段,假设这是打字错误)

相关问题 更多 >