gpt4 book ai didi

Python 类变量初始化

转载 作者:行者123 更新时间:2023-12-02 07:14:56 51 4
gpt4 key购买 nike

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

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 session 中运行它,其中对 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中进行这样的内省(introspection)?我认识到我在这里偏离了方向,所以我会接受下面的答案并做更多研究。谢谢大家!

最佳答案

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

>>> class A(object):
... clsVar = 'a'
... @classmethod
... def clsMeth(cls):
... print 'changing clsVar'
... cls.clsVar = 'b'
... A.clsMeth()
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 7, in A
NameError: name 'A' is not defined

如果 A 之前已定义(例如,如果您在 REPL 中对其进行测试),则该代码可能看起来可以工作,但是对 A.clsMeth 的调用> 会在旧类上调用,而新类将被新类所遮蔽。

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

>>> class A(object):
... clsVar = 'a'
... @classmethod
... def clsMeth(cls):
... print 'changing clsVar'
... cls.clsVar = 'b'
...
>>> A.clsMeth()
changing clsVar
>>> A.clsVar
'b'

当然,正如 fabianhrj 所说,您也可以将其放入构造函数中,但在创建实例之前不会调用它。

关于Python 类变量初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8509787/

51 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com