Python中不是类变量的私有类变量

1 投票
2 回答
590 浏览
提问于 2025-04-16 23:01

当你试图从一个类中访问 __variables 时,解析器会认为这两个下划线表示这个变量是当前类的私有变量。注意到一个无关的函数也能访问到这个“私有”变量。

这算不算一个错误呢?

>>> def f(): pass
...
>>> class A:
...     def g(self):
...             f.__x = 1
...             def h():
...                     pass
...             h.__y = 2
...             return h
...
>>> z = A().g()
>>> dir(z)
['_A__y', '__call__', '__class__', '__delattr__', '__dict__', '__doc__', '__get_
_', '__getattribute__', '__hash__', '__init__', '__module__', '__name__', '__new
__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', 'func_
closure', 'func_code', 'func_defaults', 'func_dict', 'func_doc', 'func_globals',
 'func_name']
>>> dir(f)
['_A__x', '__call__', '__class__', '__delattr__', '__dict__', '__doc__', '__get_
_', '__getattribute__', '__hash__', '__init__', '__module__', '__name__', '__new
__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', 'func_
closure', 'func_code', 'func_defaults', 'func_dict', 'func_doc', 'func_globals',
 'func_name']

在 Python 2.5 和 3.2 上进行了测试

2 个回答

0

这里有一种声明私有变量的方法:重载(也就是重新定义)__setattr__这个方法(还有其他关于属性的很多方法)。在这个方法里,你可以检查当前正在执行的方法是否在自己的类里面。如果是,就让它通过;如果不是,你可以抛出一个异常,或者使用你自己定义的错误处理逻辑。(小提示:可以用inspect.stack这个函数)

2

这是一个有详细说明的行为

这种名称修改是根据标识符的位置来进行的,只要它在类的定义中出现,就会被修改。

撰写回答