我想将有关类的一些信息存储为类(静态)变量。但是,我无法弄清楚这些东西是如何被初始化的。这是一个基本的,愚蠢的例子:
class A(object):
clsVar = 'a'
@classmethod
def clsMeth(cls):
print 'changing clsVar'
cls.clsVar = 'b'
A.clsMeth()
# prints 'changing clsVar'
print A.clsVar # prints 'a'
A.clsVar = 'b'
print A.clsVar # prints 'b'
既然函数被调用(因为 print 语句起作用),为什么类变量没有保持变化?如果我不想在类定义完成后使用元类,我是否必须使用它?
[具体来说,我想clsMeth
成为一名装饰者,并让类变量成为所有被如此装饰的函数的列表。我猜这不是实现这一目标的正确方法,所以我继续前进,但我仍然很好奇。]
编辑:正如许多人指出的那样,上面的代码不会运行。我在一个 IPython 会话中运行它,其中的调用A.clsMeth()
将引用A
和运行的先前版本。我猜这就是使用解释语言的风险。我最终选择了这样的东西:
outsideDict = {}
def outsideDec(func):
outsideDict[func.__name__] = func
class A(object):
@outsideDec
def someMethod(self):
print 'ID %s' % id(self)
def otherMethod(self):
print 'other'
print outsideDict
one, two = A(), A()
outsideDict['someMethod'](one)
outsideDict['someMethod'](two)
也许这应该是另一个问题,但是当outsideDec
运行时,有没有办法判断它的论点是哪个类的成员?或者有没有更好的方法在 Python 中进行这样的内省?我知道我在这里偏离了方向,所以我会接受下面的答案并做更多的研究。谢谢大家!