classmethod类方法跟staticmethod静态方法,看这一篇就够了

不浪费时间,直接先上结论:

1.使用@staticmethod目的是为了增加可读性,不需要参数self

的方法都可以加上@staticmethod增加可读性


2.使用@classmethod是为了处理一些__init__处理不了的赋值问

题(一般是参数不对应)



下面开始详解:


@classmethod跟@staticmethod都是一个装饰器,在函数定义前面加上,如果不知道装饰器是什么,可以参考我这篇文章《详解闭包与装饰器, 99%的人看了这篇文章后就懂了 。

其次,classmethod跟staticmethod都是类级别的方法(你可以简单理解为不需要self, 需要self的都是实例级别的方法),类级别的方法,在类定义时就存在。所以你在调用时不是先实例化一个类,再调用参数,而是,直接使用类里的方法,具体看下文调用classmethod时的



staticmethod的就不说了,只要可以不用self的方法,就可以加上增加可读性


我们来说classmethod吧,如果你现在有一个类,要打印传入的三个数,可能是这样。

classmethod类方法跟staticmethod静态方法,看这一篇就够了

但是,你这三个数,可能存放在列表里,此时你就不能这样传参了,因为__init__的参数不接受一个列表,所以你需要显示调用classmethod来处理

classmethod类方法跟staticmethod静态方法,看这一篇就够了

classmethod的返回值会传入__init__进行数值初始化,简单来说,就是在__init__先做预处理以处理其他情况。

参数cls代表此类。这样,如果__init__能直接初始化的,就交给它,不行就先用classmethod先进行预处理


以上便是classmethod跟staticmethod的主要功能。很多人写了一堆都没讲清楚,其实就是这点功能而已,其他一般不需要深究