静态方法:@staticmethod、@classmethod;静态方法可以直接被类调用或类实例调用,也就是说静态函数的第一个参数不需要制定为self,也不需要只有对象(类的实例)才能调用
:示例1:
class ClassA(object): @staticmethod def teststatic(aa): print("静态方法:",aa) def testnormal1(bb): print('常规方法1:', bb) def testnormal2(self, cc): print("常规方法2:", cc) ClassA.teststatic(11) # 类调用 ClassA.testnormal1(22) ClassA.testnormal2(33)
结果:
静态方法: 11
常规方法1: 22
Traceback (most recent call last):
File "E:/auto_test/pythonxuexi/py12.py", line 18, in <module>
ClassA.testnormal2(33)
TypeError: testnormal2() missing 1 required positional argument: 'cc'
分析:testnormal2在类调用时需要传入两个参数(形参self,实参cc),而实际上只传入一个参数,所以报错
示例2:
class ClassA(object): @staticmethod def teststatic(aa): print("静态方法:",aa) def testnormal1(bb): print('常规方法1:', bb) def testnormal2(self, cc): print("常规方法2:", cc) A = ClassA() # 类的实例化 A.teststatic(11) # 实例调用 A.testnormal2(33) A.testnormal1(22)
结果:
Traceback (most recent call last):
File "E:/auto_test/pythonxuexi/py12.py", line 24, in <module>
A.testnormal1(22)
TypeError: testnormal1() takes 1 positional argument but 2 were given
静态方法: 11
常规方法2: 33
分析:testnormal1的第一个参数不是self,在类实例调用时自动将类实例对象作为第一个参数传入该方法,所以在调用时,解释器提示testnormal1函数只定义一个参数,而传了2个参数
示例3:
class ClassB(object): @classmethod def testclass(cls, a): print("classmethod示例函数:", a) ClassB.testclass(123) # 类调用 B = ClassB() # 类实例化 B.testclass(456) # 实例调用
结果:
classmethod示例函数: 123
classmethod示例函数: 456
分析:使用@classmethod方法,无论使用类调用还是示例调用,都是将第一个参数传入。