在实例方法中访问静态类变量

时间:2015-12-12 18:48:16

标签: python class

假设我将课程Test定义为:

class Test
    test_var = 2
    def test_func():
        print(test_var)

我可以找出test_var很好的内容:

>>> Test.test_var
2

...但是调用Test.test_func()不起作用。

>>> Test.test_func()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in test
NameError: name 'test_var' is not defined

如果我像这样更改Test.test_func()(请注意这是伪代码):

redef test_func():
    print(Test.test_var)

工作正常:

>>> Test.test_func()
2

......这是有道理的。但是我怎样才能使第一个例子起作用,记住我希望test_func是一个实例方法

请注意,上面发布的代码是示例代码,因此应忽略拼写错误。

3 个答案:

答案 0 :(得分:1)

您始终可以通过实例访问类级属性,即self,只要您没有使用相同名称的实例属性对它们进行阴影处理即可。所以:

def test_func(self):
    print(self.test_var)

答案 1 :(得分:0)

如果你不需要自己,你需要将自己(几乎总是你想要的)传递给类方法,或者添加@classmethod或@staticmethod装饰器。然后创建该类的实例并调用test_func方法。

Examples:
# test_var is an class variable and test_func has a classmethod decorator
>>> class Test:
...     test_var = 2
...     @classmethod
...     def test_func(cls):
...         print(cls.test_var)
... 
>>> t = Test()
>>> t.test_func()
2


# test_var is an class variable and test_func has a staticmethod decorator
>>> class Test:
...     test_var = 2
...     @staticmethod
...     def test_func():
...         print(Test.test_var)
... 
>>> t = Test()
>>> t.test_func()
2

# test_var is an instance variable here
>>> class Test:
...     self.test_var = 2
...     def test_func(self):
...         print(self.test_var)
... 
>>> t = Test()
>>> t.test_func()
2

答案 2 :(得分:0)

在您的示例中,test_func只是一个函数,虽然它在类命名空间中定义,但函数本身并不知道类命名空间。您需要常规实例方法或类方法。

class Test:

    test_var = 2

    def instance_test(self):
        # instance methods will look in self first and class namespace second
        print(self.test_var)

    @classmethod
    def class_test(cls):
        # class methods take the class itself as first argument
        print(cls.test_var)

t = Test()
t.instance_test()
Test.class_test()