Python设置属性优先级和覆盖

时间:2013-02-20 05:41:25

标签: python

我对这三种方法感到困惑

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

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

  1. 这是最低级别的功能,因此无论指定的变量值如何分配,但我的估值值不会得到b.xsttattr__setattr

2 个答案:

答案 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__属性(并非所有对象都有)