从字典生成python类
如何从字典生成python类从字典生成python类,python,Python,如何从字典生成python类 类tObject(对象): 通过 def类工厂(js#u obj,BaseClass=tObject):#js#u obj实际上是一个dict newclass=基类 如果存在(js_obj,dict): setattr(新类,'.'名称'.'对象'.'类型'.] 对于js_obj.items()中的k,v: 如果存在(v,dict): newcls=类别工厂(v) 其他: newcls_uv= setattr(新类、新类、新类) 打印(新类名称) 一切都很顺利,
类tObject(对象):
通过
def类工厂(js#u obj,BaseClass=tObject):#js#u obj实际上是一个dict
newclass=基类
如果存在(js_obj,dict):
setattr(新类,'.'名称'.'对象'.'类型'.]
对于js_obj.items()中的k,v:
如果存在(v,dict):
newcls=类别工厂(v)
其他:
newcls_uv=
setattr(新类、新类、新类)
打印(新类名称)
一切都很顺利,直到我添加了几行代码,将字典中的dict值翻译到它们自己的类中。我的代码刚刚停止,没有任何错误
下面是一个js_obj的示例
{'@type': 'message',
'author_signature': '',
'can_be_deleted_for_all_users': True,
'can_be_deleted_only_for_self': True,
'can_be_edited': False,
'can_be_forwarded': True,
'chat_id': 416195206,
'contains_unread_mention': False,
'content': {'@type': 'messageText',
'text': {'@type': 'formattedText', 'entities': [], 'text': 'Hello World'}},
'date': 1577954356,
'edit_date': 0,
'id': 1827667968,
'is_channel_post': False,
'is_outgoing': False,
'media_album_id': '0',
'reply_to_message_id': 0,
'sender_user_id': 416195206,
'ttl': 0,
'ttl_expires_in': 0.0,
'via_bot_user_id': 0,
'views': 0}```
我认为您可能混淆了这里的类和对象。属性的值通常是类的实例,即对象,而不是类本身。这就是为什么如果您将要创建的属性的值设置为类,事情就会破裂 如果您实际上只是想从字典中创建一个对象(而不是一个可以用来实例化多个对象的类),那么类似这样的方法是可行的:
class FromDict:
def __init__(self, dct):
for key in dct:
setattr(self, key,
dct[key] if not isinstance(dct[key], dict) else FromDict(dct[key]))
如果确实需要类工厂,则需要更多代码来正确实例化需要指定为属性值的对象。您可以为其中的每一个生成setter,并在新类中生成更多的内部类,但我怀疑这会非常有用,而且比这里简单的答案所保证的要多一些。我认为您可能会混淆这里的类和对象。属性的值通常是类的实例,即对象,而不是类本身。这就是为什么如果您将要创建的属性的值设置为类,事情就会破裂 如果您实际上只是想从字典中创建一个对象(而不是一个可以用来实例化多个对象的类),那么类似这样的方法是可行的:
class FromDict:
def __init__(self, dct):
for key in dct:
setattr(self, key,
dct[key] if not isinstance(dct[key], dict) else FromDict(dct[key]))
如果确实需要类工厂,则需要更多代码来正确实例化需要指定为属性值的对象。你可以为每一个类生成setter,并在新类中生成更多的内部类,但我怀疑这会非常有用,而且比这里简单的答案要复杂一些。你能添加一个产生问题的
js_obj
的最小示例吗?现在不行,明天我就可以。它们基本上是tdlib json响应,因此您可能应该复制基类
,而不要使用TdObject
作为其默认值,因为类是可变的。newclass
可能应该是BaseClass
的一个实例,而不是类本身:newobj=BaseClass()
。我添加了一个js_obj@markmeyer的示例。你能添加一个产生问题的最小示例吗?现在不行,明天我就可以。它们基本上是tdlib json响应,因此您可能应该复制基类
,而不要使用TdObject
作为其默认值,因为类是可变的。newclass
可能应该是BaseClass
的一个实例,而不是类本身:newobj=BaseClass()
。我添加了一个js_obj@MarkMeyer的示例