我正在尝试通过 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内部的验证。
答案 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
的类。