【发布时间】:2020-12-19 00:51:14
【问题描述】:
我的设计中还有一些其他嵌套类,我正在使用字典实例化一个对象,该字典后来本身是从 JSON 文件转换而来的。在 JSON 文件中,我有嵌套关系,例如 Employee 和 Education 列表(1 到多个)。为简单起见,我举以下例子来提出我的问题:
我定义了以下类:
def ensure_type(value, types):
if (isinstance(value, list)): # when value is a list
for element in value:
ensure_type(element, types)
return value
elif isinstance(value, dict):
for k,v in value.items(): # when value is a dict
ensure_type(v, types)
return value
elif isinstance(value, types):
return value
else:
raise TypeError('Value {value} is {value_type}, but should be {types}!'.format(value=value, value_type=type(value), types=types))
class Education:
def __init__(self, **kwargs):
print('im here')
self.school_name = ensure_type(kwargs.get('school_name'), str)
class Employee:
def __init__(self, **kwargs):
self.fname = ensure_type(kwargs.get('fname'), str)
self.education = ensure_type(kwargs.get('education'), Education)
我使用自定义函数ensure_type 验证type。
我想使用以下方法实例化一个员工:
if __name__ == "__main__":
emp_dict = {'fname': 'Bob', 'education': [{'school_name':'foo'}, {'school_name':'bar'}]}
employee1 = Employee(**emp_dict)
当我尝试上述方法时,我收到以下错误:
File "test.py", line 32, in <module>
employee1 = Employee(**emp_dict)
File "test.py", line 26, in __init__
self.education = ensure_type(kwargs.get('education'), Education)
File "test.py", line 5, in ensure_type
ensure_type(element, types)
File "test.py", line 9, in ensure_type
ensure_type(v, types)
File "test.py", line 14, in ensure_type
raise TypeError('Value {value} is {value_type}, but should be {types}!'.format(value=value, value_type=type(value), types=types))
TypeError: Value foo is <class 'str'>, but should be <class '__main__.Education'>!
当我使用以下行更新 Employee 类时:
self.education = Education(kwargs.get('education'))
我收到以下错误:
Traceback (most recent call last):
File "testt.py", line 32, in <module>
employee1 = Employee(**emp_dict)
File "testt.py", line 26, in __init__
self.education = Education(kwargs.get('education'))
TypeError: __init__() takes 1 positional argument but 2 were given
如果您能指导我如何解决此问题,我将不胜感激。
注意: 最初,我定义了类似于以下内容的构造函数:
def __init__(self, iterable=(), **kwargs):
self.__dict__.update(iterable, **kwargs)
这是一种非常强大和灵活的方法,但是我需要将一些(或全部)属性设置为required,即用户必须在实例化Employee 对象时提供它们的值。这就是我选择不采用上述方法的原因。
【问题讨论】:
-
请edit您的问题并提供可运行的minimal reproducible example。
-
@martineau 感谢您的评论。我编辑了帖子并使其可运行。
标签: python dictionary constructor inner-classes