2 回答
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
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 文档
添加回答
举报