在静态函数中添加类属性和在类外部赋值之间的区别

时间:2013-05-25 12:40:32

标签: python

有代码:

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是?

2 个答案:

答案 0 :(得分:2)

正如Python tutorial所说:

  

这种修改完成时不考虑标识符的句法位置,只要它出现在类的定义中。

名称修改发生在编译时,代码是class语句中的词法。 class语句之外的代码不会出现这种情况。对于在class语句之外定义然后添加到类对象的函数中的代码,不会发生这种情况。对于exec语句中evalclass调用动态执行的代码,不会出现这种情况。

答案 1 :(得分:0)

正是因为你在类之外声明了它,并且在类中发生了名称错误。