当类的方法不需要访问实例时,根据具体场景选择使用@staticmethod或者是@classmethod进行装饰。Python中一般的类方法要接收一个self参数表示此类的实例,但是有些方法不需要访问实例,这分为两种情况:
1.方法不需要访问任何成员,或者只需要显式访问这个类自己的成员,这样的方法不需要额外的参数,应当用@staticmethod装饰。在Python3.X版本中,允许直接定义不含self参数的方法,并且允许不通过实例调用。但是一旦通过实例调用这个方法,就会因为参数不匹配而出错。加上@staticmethod进行修饰,可以让Python解释器明确此方法不需要self参数,提前拦截问题,可读性也更好;
错误示例:
class MyClass: def my_func(): # 没有用@staticmethod修饰,通过实例调用会出错 pass MyClass.my_func() # Python 3.X中允许,2.X中出错 my_instance = MyClass() my_instance.my_func() # Python 3.X和2.X中都会出错
正确示例:
class MyClass: @staticmethod def my_func(): # 没有用@staticmethod修饰,通过实例调用会出错 pass MyClass.my_func() # OK my_instance = MyClass() my_instance.my_func() # OK
2.方法不需要访问实例的成员,但需要访问基类或者派生类的成员,这时应当用@classmethod装饰,装饰后的方