python内置setattr函数赋值时会跳过定义的setter方法吗?

python内置setattr函数赋值时会跳过定义的setter方法吗?,第1张

如下代码,定义了私有属性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算在使用者自己头上

所以经过试验,标题的答案是:可以是跳过,但最好是不跳过。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/733916.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-04-27
下一篇2022-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存