Python中@staticmethod和@classmethod的作用与区别详解

Python的类方法的调用,一般都需要实例化后调用;或者类调用,传递实例引用。

class Hello(object):
site = "21yi.com"

def funcA(self):
return "instantiation " + self.site

# 实例方法funcA怎么访问?
r = Hello().funcA() # 实例化后调用
print(r)
r = Hello.funcA(Hello()) # 直接通过类调用,但是需要传递实例引用
print(r)

@classmethod@staticmethod装饰器声明之后,方法可以直接用类名.方法名()调用。

但是@classmethod和@staticmethod虽然都可以直接类调用,但是有什么区别呢?

 

  @classmethod @staticmethod
self参数 不需要 不需要
cls参数 需要 不需要

@classmethod是通过cls参数,来调用类的属性,类的方法,实例化对象的。

 

看具体实例:

class Hello(object):
site = "21yi.com"

def funA(self):
return "instantiation " + self.site

@classmethod
def funB(cls):
print(cls().funA()) # instantiation 21yi.com
return "@classmethod " + cls.site

@staticmethod
def funC():
return "@staticmethod " + Hello.site


r = Hello.funB()
print(r) # @classmethod 21yi.com

r = Hello.funC()
print(r) # @staticmethod 21yi.com

在funB方法中,因为site是静态变量,可以直接用cls.site访问到。如果是实例变量,就需要cls().xxx才能访问到了。