有代码:
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
是?
答案 0 :(得分:2)
正如Python tutorial所说:
这种修改完成时不考虑标识符的句法位置,只要它出现在类的定义中。
名称修改发生在编译时,代码是class
语句中的词法。 class
语句之外的代码不会出现这种情况。对于在class
语句之外定义然后添加到类对象的函数中的代码,不会发生这种情况。对于exec
语句中eval
或class
调用动态执行的代码,不会出现这种情况。
答案 1 :(得分:0)
正是因为你在类之外声明了它,并且在类中发生了名称错误。