Python类变量初始化

前端之家收集整理的这篇文章主要介绍了Python类变量初始化前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我想将类的一些信息存储为类(静态)变量.但是,我无法弄清楚这些东西是如何初始化的.这是一个基本的,愚蠢的例子:

  1. class A(object):
  2. clsVar = 'a'
  3. @classmethod
  4. def clsMeth(cls):
  5. print 'changing clsVar'
  6. cls.clsVar = 'b'
  7. A.clsMeth()
  8. # prints 'changing clsVar'
  9. print A.clsVar # prints 'a'
  10. A.clsVar = 'b'
  11. print A.clsVar # prints 'b'

由于调用函数(因为print语句有效),为什么类变量不会保持更改?如果在类定义完成后我不想这样做,我是否必须使用元类?

[具体来说,我希望clsMeth是一个装饰器,并让类变量成为所有装饰的函数的列表.我猜这不是实现这一目标的正确方法,所以我继续前进,但我仍然很好奇.

编辑:正如许多人所指出的,上面的代码将无法运行.我在一个IPython会话中运行它,其中对A.clsMeth()的调用将引用先前版本的A并运行.我想这就是使用解释性语言的风险.我结束了这样的事情:

  1. outsideDict = {}
  2. def outsideDec(func):
  3. outsideDict[func.__name__] = func
  4. class A(object):
  5. @outsideDec
  6. def someMethod(self):
  7. print 'ID %s' % id(self)
  8. def otherMethod(self):
  9. print 'other'
  10. print outsideDict
  11. one,two = A(),A()
  12. outsideDict['someMethod'](one)
  13. outsideDict['someMethod'](two)

也许这应该是另一个问题,但是当outsideDec运行时,有没有办法告诉它的参数是什么类?或者,有没有更好的方法在Python中进行这样的内省?我知道我在这里偏离正轨,所以我会接受下面的答案并做更多的研究.感谢大家!

最佳答案
在A的定义中对A.clsMeth()的调用将不会运行,因为此时A不存在:

  1. >>> class A(object):
  2. ... clsVar = 'a'
  3. ... @classmethod
  4. ... def clsMeth(cls):
  5. ... print 'changing clsVar'
  6. ... cls.clsVar = 'b'
  7. ... A.clsMeth()
  8. ...
  9. Traceback (most recent call last):
  10. File "

如果之前已经定义了A(例如,如果你在REPL中测试它),那么代码可能似乎有效,但是对旧的类调用了对A.clsMeth的调用,这将被新的类所影响.一.

但是,我们绝对可以在定义之后调用调用并获得您想要的结果:

  1. >>> class A(object):
  2. ... clsVar = 'a'
  3. ... @classmethod
  4. ... def clsMeth(cls):
  5. ... print 'changing clsVar'
  6. ... cls.clsVar = 'b'
  7. ...
  8. >>> A.clsMeth()
  9. changing clsVar
  10. >>> A.clsVar
  11. 'b'

当然,正如fabianhrj所指出的,你也可以将它放在构造函数中,但是在创建实例之前不会调用它.

猜你在找的Python相关文章