python中有三种方法,分别是实例方法、静态方法(staticmethod) 和 类方法(classmethod)。
- 实例方法只能通过实例对象调用,不能通过类进行调用。实例方法再定义时候使用关键字self,self代表实例对象本身。
- 静态方法可以使用实例对象调用,也可以使用类进行调用,他的的特点没有参数限制,定义时需要在函数前加@staticmethod
- 类方法可以被类调用,也可以被实例对象调用,实例调用可以给类增加属性,类的属性修改需要通过类进行修改,类方法需要使用关键字cls,定义时候需要在函数前加@classmethod
看一个示例
class A:
def fun1(self):
print('我是实例方法(对象方法),第一个参数是该对象')
@classmethod
def fun2(cls):
print('我是类方法,第一个参数是类')
@staticmethod
def fun3(a, b):
print('我是静态方法,我的参数和此类毫无关系,不写参数也可以')
if __name__ == '__main__':
a = A()
a.fun1() # 我是实例方法(静态方法),第一个参数是该对象
A.fun1(a) # 可以用类调用对象方法吗?答案是否定的(虽然此地方可以运行,但是这句话还算对)
A.fun2() # 我是类方法,第一个参数是类
A.fun3(2, 3) # 我是静态方法,我的参数和此类毫无关系,不写参数也可以
a.fun2() # 我是类方法,第一个参数是类。(虽然传递的是对象,但是会知道该对象属于哪个类)
a.fun3(1, 2) # 我是静态方法,我的参数和此类毫无关系,不写参数也可以
三种方法除了使用上,其他地方有什么不同呢?
- 静态方法类似普通函数,参数里面不用传递 self。有一些方法和类相关,但是又不需要类中的任何信息,出于对代码的理解和维护,就可用使用静态方法。静态方法最大的优点是能节省开销,因为它不会绑定到实例对象上,它在内存中只生成一个。
- 而实例方法每个实例对象都是独立的,开销较大。
- 而类方法与实例方法类似,但是类方法传递的不是实例,而是类本身。当需要和类交互而不需要和实例交互时,就可以选择类方法。


![[7天通关Python基础]-14:classmethod和staticmethod的区别 [7天通关Python基础]-14:classmethod和staticmethod的区别](http://www.mshxw.com/aiimages/31/1002104.png)
