Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从字典生成python类_Python - Fatal编程技术网

从字典生成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(新类、新类、新类) 打印(新类名称) 一切都很顺利,

如何从字典生成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(新类、新类、新类)
打印(新类名称)
一切都很顺利,直到我添加了几行代码,将字典中的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的示例