2011-03-12 116 views
1

我试图通过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) 

而在另一个脚本中,创建一个实例,并要指定属性,让财产突变处理简单的验证。

myClass = MyClass() 
new_value = None 

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

的问题是,它似乎并没有被调用setMyProperty(个体经营,价值)突变。对于一个快速测试,以验证它不会叫,我改增变到:

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

我是相当新的Python的,也许还有另一种方法做我想要做的,但有人可以解释为什么mutatator没有被调用时setattr(self,item,value)被调用?

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

+1

你真的使用你的setter和getter函数定义一个属性吗?你的代码不显示这样的定义。 Python应该如何知道'my_property'使用什么getter和setter? – 2011-03-12 22:54:16

+0

@Sven Marnach:糟糕,忘记补充说明了。但是,是的,我在实际的代码中定义了它。 – 2011-03-12 22:56:12

回答

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所有类都自动从object继承。尽管如此,看看它是否有帮助。

为了让它更清晰:试试myClass.my_property = 4。这是否引发异常?如果不是那么这是继承自object的问题 - 属性仅适用于新式类,即从object继承的类。

+2

实际上,最后一段是解决方案:Python 2.7仍然区分旧式和新式类。 – 2011-03-12 23:03:12

+1

该问题未指定它从**对象**继承。谢谢。 – 2011-03-12 23:15:05