从静态变量引用静态方法

时间:2016-03-08 09:15:37

标签: python python-2.7 static

在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

这似乎可以胜任,但有些麻烦。

3 个答案:

答案 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