通过字符串设置属性

时间:2011-03-12 22:51:29

标签: python properties setattr

我正在尝试通过 setattr(self,item,value) 函数在类之外设置一个Python类属性。

class MyClass:
    def getMyProperty(self):
        return self.__my_property

    def setMyProperty(self, value):
        if value is None:
            value = ''
        self.__my_property = value

    my_property = property( getMyProperty, setMyProperty )

在另一个脚本中,我创建了一个实例,并希望指定属性并让属性mutator处理简单的验证。

myClass = MyClass()
new_value = None

# notice the property in quotes
setattr(myClass, 'my_property', new_value)

问题是它似乎没有调用 setMyProperty(self,value) mutator。为了快速测试以验证它没有被调用,我将mutator更改为:

    def setMyProperty(self, value):
        raise ValueError('WTF! Why are you not being called?')
        if value is None:
            value = ''
        self.__my_property = value

我对Python很新,也许还有另一种方法可以做我正在尝试做的事情,但有人可以解释为什么在 setattr(self,item,value)时没有调用mutator 被称为?

还有另一种通过字符串设置属性的方法吗?我需要在设置属性值时执行mutator内部的验证。

1 个答案:

答案 0 :(得分:4)

适合我:

>>> class MyClass(object):
...   def get(self): return 10
...   def setprop(self, val): raise ValueError("hax%s"%str(val))
...   prop = property(get, setprop)
...
>>> i = MyClass()
>>> i.prop =4
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in setprop
ValueError: hax4
>>> i.prop
10
>>> setattr(i, 'prop', 12)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in setprop
ValueError: hax12

你粘贴的代码似乎与我的相同,只是我的类继承自object,但这是因为我正在运行Python 2.6并且我认为在2.7中所有类都自动继承自{{1 }}。但试试看,看看它是否有帮助。

更清楚:尝试object。这是否会引发异常?如果不是那么继承自myClass.my_property = 4是一个问题 - 属性仅适用于新式类,即继承自object的类。