有代码:
class A:
@staticmethod
def g():
A.__z = 4
print(dir(A))
A.g()
print(dir(A)) # A has attribute _A__z
A.__m = 5
print(dir(A)) # A has attribute _A__z and __m
为什么名称__m
没有被破坏,_A__m
而是__z
被破坏?
有代码:
class A:
@staticmethod
def g():
A.__z = 4
print(dir(A))
A.g()
print(dir(A)) # A has attribute _A__z
A.__m = 5
print(dir(A)) # A has attribute _A__z and __m
为什么名称__m
没有被破坏,_A__m
而是__z
被破坏?
正如Python 教程所说:
只要它出现在类的定义中,就无需考虑标识符的句法位置,就可以完成这种修饰。
class
对于在语句中的词法上的代码,名称修改发生在编译时。class
语句之外的代码不会发生这种情况。class
对于在语句外部定义然后添加到类对象的函数中的代码,不会发生这种情况。由语句中的exec
oreval
调用动态执行的代码不会发生这种情况。class
正是因为您在类外部声明了它,并且名称修改发生在类内部。