Python私有变量修改疑问:外部赋值不报错却未改变原值?
关于Python私有变量修改的问题解析
嗨,你完全没有操作错误!这种“看起来能赋值却没改变原有变量”的情况,其实是Python的**名称修饰(Name Mangling)**机制在起作用,咱们一步步拆解:
为什么赋值没生效?
当你在类里定义self.__foo时,Python会自动把这个变量的名字悄悄改成_Simple__foo(格式是_类名__变量名),目的是避免子类意外覆盖这个属性,同时也给外部访问加了一层“障碍”。
你在外部执行test.__foo = 2的时候,并没有修改到原来的_Simple__foo,而是给test对象新增了一个完全独立的普通属性__foo。这就是为什么:
test.print_foo()依然输出3(它访问的是内部的_Simple__foo)print(test.__foo)输出2(它访问的是你刚新增的那个属性)
怎么让修改私有变量时触发错误?
Python本身没有严格意义上的“私有”——名称修饰只是一种约定俗成的保护,不是强制限制。但如果想实现外部无法赋值的效果,可以用@property装饰器把属性做成只读的:
修改后的类示例
class Simple: def __init__(self, foo): self.__foo = foo # 只提供getter方法,不定义setter @property def foo(self): return self.__foo def print_foo(self): print(self.__foo)
测试效果
>>> test = Simple(3) >>> print(test.foo) # 正常获取属性值 3 >>> test.foo = 2 # 尝试赋值会直接报错 AttributeError: can't set attribute
额外提醒
如果你非要从外部修改那个“私有”变量,其实可以直接写test._Simple__foo = 2——但这是非常不推荐的!因为这违背了类的封装设计,可能会导致类的内部逻辑混乱,也会让代码更难维护。
内容的提问来源于stack exchange,提问作者jrglez
相关产品推荐
相关产品推荐

