0

我真的对这三种方法感到困惑

setattr()
__setattr__
obj.x = 10

我有这个测试课

class Test(object):
    def __init__(self):
        self.__dict__['x'] = 99

b = Test()
#setattr(b,'x',10)
#b.x = 10

现在我有两个问题

bx 转换为

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

那么为什么我们使用一个而不是另一个

  1. 这是最低级别的功能,因此无论变量的值如何分配,但我的值不会使用b.xorsttattr__setattr
4

2 回答 2

0

当您b.x = 10提前知道(即编写程序时)您要分配的属性时,您可以使用。当您不知道时使用setattr(例如,如果您正在从文件中读取配置信息或进行某种动态编程)。

你永远不会这样做setattr(b, 'x', 10),因为如果你可以x在那里输入文字,你就可以完成b.x = 10并保存一些输入。你会使用setattr类似的东西:

optionName, optionValue = readConfigFile()
setattr(configObject, optionName, optionValue)

也就是说,当您直到运行时才知道要分配什么属性时才使用它。例如,这可能是因为它依赖于外部资源(如我的示例)或用户输入。

于 2013-02-20T05:46:18.907 回答
0

通常的方法是

b.x = 10

如果事先不知道属性名

attr_name = 'x'
setattr(b, attr_name, 10)

说同样的话是个好方法。

这不是设置属性的好方法b

b.__dict__['x'] = 10

正如您假设的那样,它b具有一个__dict__属性(并非所有对象都具有)

于 2013-02-20T05:46:21.257 回答