今天在群里聊天的时候有人发了一个问题,关于私有属性的,一开始也没看出什么问题后面才明白自己踩坑了,还是一些基础问题的坑,话不多说直接上代码吧
class Panda():
def __init__(self,weight):
self.__weight = weight
@property
def weight(self):
return self.__weight
panda = Panda("100KG")
print(panda.weight)
panda.__weight=100
print(panda.__weight)
运行结果如下
100KG
100
按照我以前所学,私有属性是无法直接修改的,但是panda.__weight=100却成功修改了私有属性weight。
首先我们回顾一下私有属性,私有属性是由两个下划线开头的属性,python其实并没有私有属性,但是有伪私有化,我们的__weight属性经过Python解释器对外把__weight变成了__Panda_weight,所以我们无法直接访问,但是我们可以通过__Panda_weight来访问私有__weight,但是这样做会有一个风险,不同版本的python解释器会命名成不同的,所以尽量不要这样做。说了这么多,上面这个错误就是因为这个规律导致的,内部的__weight属性早已经经过Python解释器变成了__Panda_weight这个命名,而我们这个时候再使用panda.__weight,是新增了一个变量而已,已经不是之前的那个私有属性了