学习python中经常会出现一些相近或者相似的语法模块等,需要对比分析才能加深记忆,熟练运用。
staticmethod:静态方法
classmethod:类方法
在python中,静态方法和类方法都是可以通过类对象和类对象实例访问。但是区别是:
@classmethod 是一个函数修饰符,它表示接下来的是一个类方法,而对于平常我们见到的则叫做实例方法。 类方法的第一个参数cls,而实例方法的第一个参数是self,表示该类的一个实例。
普通对象方法至少需要一个self参数,代表类对象实例
类方法有类变量cls传入,从而可以用cls做一些相关的处理。并且有子类继承时,调用该类方法时,传入的类变量cls是子类,而非父类。 对于类方法,可以通过类来调用,就像C.f(),有点类似C++中的静态方法, 也可以通过类的一个实例来调用,就像C().f(),这里C(),写成这样之后它就是类的一个实例了。
静态方法则没有,它基本上跟一个全局函数相同,一般来说用的很少。
1.一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法。
而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用。
这有利于组织代码,把某些应该属于某个类的函数给放到那个类里去,同时有利于命名空间的整洁。
2.既然@staticmethod和@classmethod都可以直接类名.方法名()来调用,那他们有什么区别呢
从它们的使用上来看,
- @staticmethod不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样。
- @classmethod也不需要self参数,但第一个参数需要是表示自身类的cls参数。
如果在@staticmethod中要调用到这个类的一些属性方法,只能直接类名.属性名或类名.方法名。
而@classmethod因为持有cls参数,可以来调用类的属性,类的方法,实例化对象等,避免硬编码。
1 # -*- coding=utf-8 -*- 2 # @Time : 2019/12/02 19:51 加班学习 3 # @Software: PyCharm 4 # @Author Jacky 5 6 class Foo(object): 7 8 # 实例方法,第一个参数必须是实例对象。一般习惯用self。 9 def instance_method(self): 10 print("是类{}的实例方法,只能被实例对象调用".format(Foo)) 11 12 # 类方法, 第一个参数必须是类 对象。一般习惯使用cls。使用@classmethod装饰器装饰。 13 14 @classmethod 15 def class_method(cls): 16 print("是类方法") 17 18 19 # 静态方法,参数没有要求,和类没有绑定关系,就是一个普通的方法 使用@staticmethod装饰器装饰。 20 @staticmethod 21 def static_method(): 22 print("是静态方法") 23 24 25 foo = Foo() 26 27 28 # 实例方法只能被实例调用 29 foo.instance_method() 30 print('==========') 31 32 # 类方法可以被类或者实例调用。 33 Foo.class_method() 34 foo.class_method() 35 36 print('----------') 37 38 # 静态方法可以被类或者实例调用。 39 Foo.static_method() 40 foo.static_method() 41 42 43 ''' 44 是类<class '__main__.Foo'>的实例方法,只能被实例对象调用 45 ========== 46 是类方法 47 是类方法 48 ---------- 49 是静态方法 50 是静态方法 51 '''View Code
小结:
理解classicmethod和staticmethod类是一种数据结构,可以创建对象。当调用类的时候就创建了一个类的实例对象。一旦对象被创建,python 就会检查是否实现了init()方法。如果init()已经被实现,那么它将被调用,实例对象作为第一个参数(self)被传递进去。