我对这三种方法感到困惑
setattr()
__setattr__
obj.x = 10
我有这个测试类
class Test(object):
def __init__(self):
self.__dict__['x'] = 99
b = Test()
#setattr(b,'x',10)
#b.x = 10
现在我有两个问题
b.x转换为
b.x = 10 --> b.__setattr__(x,10) --> b.__dict__['x'] = 10
和setattr(b,'x',10)也转换为
setattr(b,'x',10) --> b.__setattr__(x,10) --> b.__dict__['x'] = 10
那么为什么我们使用一个而不是另一个
b.x
或sttattr
或__setattr
答案 0 :(得分:0)
当您提前知道(即编写程序时)您要分配的属性时,可以使用b.x = 10
。您不知道时使用setattr
(例如,如果您正在从文件中读取配置信息或进行某种动态编程)。
你永远不会真的setattr(b, 'x', 10)
,因为如果你可以在那里输入文字x
,你可以刚刚完成b.x = 10
并保存了一些打字。您可以将setattr
用于以下内容:
optionName, optionValue = readConfigFile()
setattr(configObject, optionName, optionValue)
也就是说,直到运行时才知道你要分配的属性。例如,这可能是因为它依赖于外部资源(如我的示例所示)或用户输入。
答案 1 :(得分:0)
通常的方法是
b.x = 10
如果您事先不知道属性名称
attr_name = 'x'
setattr(b, attr_name, 10)
说同样的话是一个好方法。
这不是在b
上设置属性的好方法。
b.__dict__['x'] = 10
正如您假设b
具有__dict__
属性(并非所有对象都有)