如下代码,定义了私有属性value,并设置了setter和getter。
class TestSetter:
def __init__(self):
self._value = 1
@property
def value(self):
return self._value
@value.setter
def value(self, v):
print("value属性的setter被激活!")
self._value = v
def test1(self):
setattr(self, '_value', 2)
print(self.value)
def test2(self):
setattr(self, 'value', 2)
print(self.value)
if __name__ == '__main__':
t = TestSetter()
t.test1()
# t.test2()
设置了setter方法之后,一般是通过这样来对私有属性赋值
t = TestSetter()
t.value = 2
然而总是有逆天的二般情况不按套路出牌:在定义了setter方法之后,使用内置setattr函数进行赋值,不想改已有的代码,那么就研究下setter函数会不会被跳过吧
执行test1方法,打印结果如下
2
执行test2方法,打印结果如下
value属性的setter被激活!
2
从结果来看,不管是对value还是_value执行setattr,都能对私有属性_value赋值,但是前者走setter方法而后者没有
个人的理解是最好不要使用跳过的方法。引用《Python编程之美》对“我们都是负责任的用户”的讲解:既然这个属性被定义成私有属性,那么就有访问私有属性的规则,如果使用者打破规则强行访问,那么触发的意外的bug算在使用者自己头上
所以经过试验,标题的答案是:可以是跳过,但最好是不跳过。
|