Python中不是类变量的私有类变量
当你试图从一个类中访问 __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
这是一个有详细说明的行为。
这种名称修改是根据标识符的位置来进行的,只要它在类的定义中出现,就会被修改。