当前位置: 首页 > 后端技术 > Python

Python防止任意修改类属性

时间:2023-03-25 23:27:27 Python

如果不想让类的某个属性任意修改,常用的方法是使用属性装饰器,在属性前加上下划线。classV:def__init__(self,x):self._x=x@propertydefx(self):returnself._x这样虽然不能直接修改x,但是通过_x还是可以很方便的修改x。>>>v=V(5)>>>v.x5>>>v._x5>>>v.x=4Traceback(最近调用最后):文件“”,第1行,在AttributeError中:cantsetattribute>>>v._x=4>>>v.x4万一哪天手抖了...但是如果你用双下划线——classV:def__init__(self,x):self.__x=x@propertydefx(self):returnself.__x>>>v=V(5)>>>v.__x=4>>>v.__x4>>>v.x5由于python的名称修改功能(name加工)。Python会在实例的__dict__属性中为以双下划线开头的实例属性名添加下划线和类名。>>>v=V(5)>>>v.__dict__{'_V__x':5}>>>v.__x=4>>>v.__dict__{'_V__x':5,'__x':4}of当然,修改v.x的值还是可以的,只要修改v._V__x就可以了,但是误操作的可能性降低了很多。附:类也有一个__dict__属性。然而,名称重写的应用并不像防止无意访问那么简单。根据EffectivePython的说法:只有一种情况可以合理地使用私有属性,那就是避免子类和超类的属性名发生冲突。(详见P79-P80)