在python 2.7中,我想创建一个静态变量,它存储运行封闭类的静态方法的结果。
我尝试了以下内容:
class A:
@staticmethod
def foo():
return 1
v = A.foo() # a static variable
print A.v
返回错误:
NameError: name 'A' is not defined
但是,引用另一个类'静态变量起作用:
class B:
@staticmethod
def foo():
return 1
class A:
@staticmethod
def foo():
return 1
v = B.foo()
print A.v
>>> 1
有任何解释吗?
编辑:
此场景的用例是缓存foo的结果,并将其括在A的名称空间下。 根据答案我理解A在执行时尚未定义,这会导致错误。 我想出了以下内容来推迟计算:
class A:
@staticmethod
def foo():
print 'running foo'
return 1
@staticmethod
def get_v():
try:
return A.v
except AttributeError:
A.v = A.foo()
return A.v
print A.get_v()
print A.get_v()
>>> running foo
>>> 1
>>> 1
这似乎可以胜任,但有些麻烦。
答案 0 :(得分:3)
使用@classmethod
,并将值缓存在类对象上。
class S(object):
@classmethod
def f(klass):
if not hasattr(klass, '_f'):
print "Calculating value"
klass._f = 5
return klass._f
从不同的实例调用两次时:
>>> s = S()
>>> s2 = S()
>>> s.f()
Calculating value
5
>>> s2.f()
5
该值在S
的所有实例上共享。
答案 1 :(得分:1)
除了想知道你为什么这样做之外:当你指定v
时(在v = A.foo()
行中,A
尚未定义。({{{{ 1}}是整个 A
块,因此在该块之后才定义class
。)
在您的第二个示例中,当您说A
时已经定义了B
。
v = B.foo()
运行此代码会导致
class A:
@staticmethod
def foo():
return 1
v = foo()
答案 2 :(得分:1)
在类完全定义(块class
结束)之前,不能从类A调用(静态)方法。但是,只要定义了类,就可以定义一个静态变量:
class A:
@staticmethod
def foo():
print "running foo"
return 1
A.v = A.foo()
然后您可以随时随地使用
print A.v