请考虑以下代码:
def __g_fun():
pass
__a = 3
a=3
class Test(object):
def __init__(self):
global a,__a
print "locals:",locals()
print "global:",globals()
self.aa = __a
def fun(self):
return __g_fun()
t=Test()
t.fun()
输出:
locals: {'self': <__main__.Test object at 0x7f53580d50d0>}
global: {'__g_fun': <function __g_fun at 0x7f53580c52a8>, 'a': 3, '__a': 3, '__builtins__': <module '__builtin__' (built-in)>, '__file__': 'test.py', '__package__': None, 'Test': <class '__main__.Test'>, '__name__': '__main__', '__doc__': None}
Traceback (most recent call last):
File "test.py", line 19, in <module>
t=Test()
File "test.py", line 11, in __init__
self.aa = __a
NameError: global name '_Test__a' is not defined
具有双下划线的变量是否无法在类中使用?
答案 0 :(得分:2)
确实 - Python编译器以特殊方式处理类代码中的双下划线前缀 -
在编译时,这些变量被命名为包含类名作为前缀的名称 -
因此,班级__a
内任何位置的名称Test
都将更改为_Test__a
。 (记住&#34;编译时间&#34;对用户来说通常是透明的,并且可以作为&#34;在程序运行时#34;)
这是一个功能,旨在允许一个人拥有在类的方法中评估的名称,而不是由其子类(而不是自动形式)评估的名称 - 这是一种在其他语言中由&#执行的功能34;私人&#34;成员修饰语。
检查Python类文档:https://docs.python.org/2/tutorial/classes.html#private-variables-and-class-local-references