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

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

1.使用@staticmethod目的之一是为了增加可读性,不需要参数self的方法都可以加上@staticmethod增加可读性,因为,这个方法是类级别的,在调用时要使用类名。

2.使用@classmethod是为了处理一些__init__处理不了的赋值问题(一般是参数不对应),你可以当成,有第二,第三个__init__方法,当然它要通过类名显示调用

 

 

下面开始详解:

类级别跟实例级别

虚拟机会检查你定义的类,并创建,然后再根据你的代码创建类实例。他们的关系就像你的QQ.exe程序跟QQ进程的关系,QQ.exe程序你开机就在了,而你要登陆QQ,要你双击后输入账号密码才会登陆,并且你可以登陆多个QQ号,但你只有一个QQ.exe程序。这个程序就是类,而不同QQ号的进程就是类实例。

 

相同点

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

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

 

@staticmethod

staticmethod,只要可以不用self的方法,就可以加上增加可读性,效果就像有作用域的函数,与函数不同是,静态方法可以调用类里的静态变量。(真实情况声明为静态方法,如果学过其他静态语言应该很熟悉,特别是学过C的。作用1是将生命周期变为程序运行始终存在,因为这部分是放在静态全局区的,而非静态的方法,则是放在堆的。)

静态方法经常用于处理一些有关类的相同操作,这种方法大多数也可以改成函数(但写成函数无法调用类的静态成员变量),但放在类里更加相关,让人知道你是做跟这类有关的操作,比如,这个类需要转换成json,可以把转换json的基本操作写成静态方法。编程本来就是一件很难的事了,因此,让这种难的东西让人容易读懂就是程序员的重要的任务。

静态方法也经常用于转换或者创建类实例。比如,在java或C++这种静态语言中可以写个传入Long类型,返回String类型实例的静态方法。同时这种方式经常出现在单例模式,工厂模式等设计模式中。但在python中,这种事一般交给了classmethod处理了

 

@classmethod

我们来说classmethod吧:

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

但是,你这三个数,可能存放在列表里,此时你就不能这样传参了,因为这个例子中Printnum的__init__的参数不接受一个列表(之前没说清楚被说了,尴尬,不过感谢评论让我讲清楚不会让读者误解),所以你需要显示调用classmethod来处理

classmethod:人如其名,类方法,第一个参数是cls,代表这个类(注意不是类实例),常用来调用类级方法(如系统方法跟静态方法,类方法等)来进行预处理,然后返回预处理后的类。效果就像另一个构造函数一样(实际上并不是)。

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

参数cls代表此类。cls(1,2,3)就相当于这里面的Printnum(1,2,3),即创建实例,会调用cls中的__new__方法创建类实例。而__new__会调用__init__进行初始化,然后放回类实例。因此你便通过类名Printnum调用@classmethod方法list_to_num得到b这个Printnum的一个实例

因此,要使用时,能由__init__处理的就交给它,不行就先用classmethod先进行预处理,可以说classmethod是用来扩充__init__无法初始化而产生的。(当然如果你懂一点设计模式,会发现它用途更广一些)

 

以上便是classmethod跟staticmethod的主要功能。

 

 

 

 

 

  • 18
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值