在Python中访问类中的静态方法的惯用方法

时间:2014-06-20 19:57:18

标签: python static-methods

我知道staticmethod应该始终由它们所属的类名引用。但我发现也可以通过关键字self访问它们。

这有点令人困惑,我没有看到解释器抛出错误。

import unittest

class TestA(unittest.TestCase):
    @staticmethod
    def fun1():
        return True

    @staticmethod
    def fun2():
        return False

    def test_one(self):
        assert TestA.fun1() == True

    def test_two(self):
        assert self.fun2() == False

if __name__ == '__main__':
    unittest.main()

访问static方法的正确方法是什么。与上面的TestA.fun1一样,对我来说很清楚,或者self.fun2,因为没有实例发送到fun2,因此有点担心。

2 个答案:

答案 0 :(得分:4)

无论哪种方式都可以接受,如the documentation中所述:

  

可以在类(例如C.f())或实例(例如C().f())上调用它。除了类之外,该实例将被忽略。

从某种意义上说,静态方法的一点是允许你调用方法而不必担心你是否在实例或类上调用它。

答案 1 :(得分:0)

无论哪种方式“有效”,但如果可能,您应该使用实例进行调用。这允许它在您继承TestA的情况下正常工作。也就是说,它将正确地找到“self”类型的静态方法的实现,而不是硬编码的TestA。如果你在一个你有“cls”变量的环境中(比如一个类方法或工厂函数),你应该调用它。如果您总是想要调用TestA实现,通常只有在本地范围内没有self或cls引用时,才会直接命名类对象。