为了账号安全,请及时绑定邮箱和手机立即绑定

Python从字典创建类实例

Python从字典创建类实例

鸿蒙传说 2023-03-08 15:28:09
我有很多字段可以在我的程序运行时更改的类,但是当我在我的init中创建新对象时,我只能更改其中的一些,我想将这些更改保存到 JSON 文件中,以后可以创建具有这些变量的新对象。除了让我的init接受 100 个参数之外,还有其他方法吗?换句话说,我希望它是这样的:class MyClass:    def __init__(self, q, w):        self.q = q        self.w = w        self.e = 30        self.r = 40        a = MyClass(10,20)dct = {'q': 100, 'w': 200, 'e': 300, 'r': 400}print('before:', tmp.q, tmp.w, tmp.e, tmp.r)for i in dct:    #do sth hereprint('after:', tmp.q, tmp.w, tmp.e, tmp.r)before: 10 20 30 40after: 100 200 300 400
查看完整描述

2 回答

?
慕丝7291255

TA贡献1859条经验 获得超6个赞

以下是如何使用关键字参数来做到这一点:


class MyClass:

    def __init__(self, **q):

        self.__dict__.update(q)


a = MyClass(a=10, b=20, c=50, d=69)


print(a.a)

print(a.b)

print(a.c)

print(a.d)

输出:


10

20

50

69

用字典:

class MyClass:

    def __init__(self, **q):

        self.__dict__.update(q)

        

dct = {'q': 100, 'w': 200, 'e': 300, 'r': 400}


a = MyClass(**dct)


print(a.q, a.w, a.e, a.r)

输出:


100 200 300 400


查看完整回答
反对 回复 2023-03-08
?
HUH函数

TA贡献1836条经验 获得超4个赞

与其操纵类实例__dict__,我建议使用该setattr方法。


class MyClass:

    def __init__(self, new_vals):

        for k, v in new_vals.items():

            setattr(self, k, v)


dct = {'q': 100, 'w': 200, 'e': 300, 'r': 400}


a = MyClass(dct)


print(a.q, a.w, a.e, a.r)

恕我直言,内部结构有两个前导下划线是有原因的__dict__。我的一般建议是尽可能避免访问任何带有两个前导下划线的属性/方法。另请参阅下文以获取对考虑此主题的 Python 文档的参考。


如果你想把它减少到一行,你也可以使用“虚拟”列表理解。下划线捕获None返回值,但不一定是必需的。


class MyClass:

    def __init__(self, new_vals):

        _ = [setattr(self, k, v) for k, v in new_vals.items()]

对有关操作内置__dict__属性的 Python 文档的简短参考:


每个模块的特殊属性是__dict__. 这是包含模块符号表的字典。__dict__修改这个字典实际上会改变模块的符号表,但是不能直接给属性赋值(你可以写m.__dict__['a'] = 1,它定义m.a为1,但你不能写m.__dict__ = {})。不建议直接修改。__dict__


请参阅有关内置类型的 Python 文档


查看完整回答
反对 回复 2023-03-08
  • 2 回答
  • 0 关注
  • 86 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信