我理解静态方法应该总是由它们所属的类名来引用。但是我看到它们也可以通过关键字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()
访问静态方法的正确方法是什么?就像上面的TestA.fun1
,我很清楚,或者self.fun2
,有点担心,因为没有实例发送到fun2。
两种方法都是可以接受的,如文档中所述:
可以在类(如
C.f()
)上调用,也可以在实例(如C().f()
)上调用。该实例被忽略,除了它的类。
在某种意义上,静态方法的意义在于允许您调用该方法,而不必担心您是在实例上还是在类上调用它。
两种方法都"有效",但如果可能的话,应该使用实例调用。这允许它在创建TestA子类的情况下正常工作。也就是说,它将正确地找到"self"类型的静态方法的实现,而不是硬编码的TestA。如果您处于具有"cls"变量(例如类方法或工厂函数)的上下文中,则应该调用该变量。只有当你总是想调用TestA实现时,你才会直接命名类对象,特别是当你在局部作用域中没有self或cls引用时。