Python中staticmethod和classmethod的作用与区别


Posted in Python onOctober 11, 2018

一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法。

而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用。

这有利于组织代码,把某些应该属于某个类的函数给放到那个类里去,同时有利于命名空间的整洁。

既然@staticmethod和@classmethod都可以直接类名.方法名()来调用,那他们有什么区别呢

从它们的使用上来看

  • @staticmethod不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样。
  • @classmethod也不需要self参数,但第一个参数需要是表示自身类的cls参数。

如果在@staticmethod中要调用到这个类的一些属性方法,只能直接类名.属性名或类名.方法名。

而@classmethod因为持有cls参数,可以来调用类的属性,类的方法,实例化对象等,避免硬编码。

要明白,什么是实例方法、静态方法和类方法:

class Demo(object):
 def instance_method(self, your_para):
 """
 this is an instance_method
 you should call it like the follow:
 a = Demo()
 a.instance_method(your_para)
 plus: in python, we denote 'cls' as latent para of Class
 while 'self' as latent para of the instance of the Class
 :param your_para: 
 :return: 
 """
 print("call instance_method and get:", your_para)
 @classmethod
 def class_method(cls, your_para):
 """
 this is a class_method
 you can call it like the follow:
 method1:
 a = Demo()
 a.class_method(your_para)
 method2:
 Demo.class_method
 plus: in python, we denote 'cls' as latent para of Class
 while 'self' as latent para of the instance of the Class
 :param your_para: 
 :return: 
 """
 print("call class_method and get:", your_para)
 @staticmethod
 def static_method(your_para):
 """
 this is a static_method and you can call it like the 
 methods of class_method
 :param your_para: 
 :return: 
 """
 print("call static_method and get:", your_para)

虽然类方法在调用的时候没有显式声明cls,但实际上类本身是作为隐含参数传入的。这就像实例方法在调用的时候也没有显式声明self,但实际上实例本身是作为隐含参数传入的。

对于静态函数,我们一般把与类无关也与实例无关的函数定义为静态函数。例如入口检查的函数就最好定义成静态函数。

类方法的妙处, 在继承中的作用:

class Fruit(object):
 total = 0 # 这是一个类属性
 @classmethod
 def print_total(cls):
 print('this is the ', cls, '.total:', cls.total, ' and its id: ', id(cls.total)) # cls是类本身,打印类属性total的值
 print('this is the Fruit.total:', Fruit.total, 'and its id: ', id(Fruit.total))
 print("=======================")
 @classmethod
 def set(cls, value):
 cls.total = value
class Apple(Fruit):
 pass
class Orange(Fruit):
 pass
app1 = Apple()
app1.set(10)
app1.print_total()
Apple.print_total()
Fruit.set(2)
app1.print_total()
Fruit.print_total()
"""
output:
this is the <class '__main__.Apple'> .total: 10 and its id: 1355201264
this is the Fruit.total: 0 and its id: 1355200944
=======================
this is the <class '__main__.Apple'> .total: 10 and its id: 1355201264
this is the Fruit.total: 0 and its id: 1355200944
=======================
this is the <class '__main__.Apple'> .total: 10 and its id: 1355201264
this is the Fruit.total: 2 and its id: 1355201008
=======================
this is the <class '__main__.Fruit'> .total: 2 and its id: 1355201008
this is the Fruit.total: 2 and its id: 1355201008
=======================
"""

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

Python 相关文章推荐
python函数返回多个值的示例方法
Dec 04 Python
Python HTMLParser模块解析html获取url实例
Apr 08 Python
python发送HTTP请求的方法小结
Jul 08 Python
Python实现批量修改文件名实例
Jul 08 Python
Python实现自动登录百度空间的方法
Jun 10 Python
django manage.py扩展自定义命令方法
May 27 Python
python脚本监控Tomcat服务器的方法
Jul 06 Python
python爬虫项目设置一个中断重连的程序的实现
Jul 26 Python
Python利用WMI实现ping命令的例子
Aug 14 Python
Python使用Slider组件实现调整曲线参数功能示例
Sep 06 Python
如何使用python传入不确定个数参数
Feb 18 Python
浅析Python 字符编码与文件处理
Sep 24 Python
对Python 窗体(tkinter)文本编辑器(Text)详解
Oct 11 #Python
详谈Python 窗体(tkinter)表格数据(Treeview)
Oct 11 #Python
Python GUI布局尺寸适配方法
Oct 11 #Python
10 行 Python 代码教你自动发送短信(不想回复工作邮件妙招)
Oct 11 #Python
对Python 窗体(tkinter)树状数据(Treeview)详解
Oct 11 #Python
Django 路由系统URLconf的使用
Oct 11 #Python
Python 中的lambda函数介绍
Oct 10 #Python
You might like
Linux下 php5 MySQL5 Apache2 phpMyAdmin ZendOptimizer安装与配置[图文]
2008/11/18 PHP
PHP入门学习笔记之一
2010/10/12 PHP
浅析php原型模式
2014/11/25 PHP
laravel邮件发送的实现代码示例
2020/01/31 PHP
Javascript实例教程(19) 使用HoTMetal(3)
2006/12/23 Javascript
jquery 新手学习常见问题解决方法
2010/04/18 Javascript
JAVASCRIPT实现的WEB页面跳转以及页面间传值方法
2010/05/13 Javascript
初识javascript 文档碎片
2010/07/13 Javascript
JavaScript自动设置IFrame高度的小例子
2013/06/08 Javascript
JavaScript实现页面实时显示当前时间的简单实例
2013/07/20 Javascript
使用js显示当前时间示例
2014/03/02 Javascript
node.js开发中使用Node Supervisor实现监测文件修改并自动重启应用
2014/11/04 Javascript
javascript白色简洁计算器
2015/05/04 Javascript
JQuery ztree带筛选、异步加载实例讲解
2016/02/25 Javascript
jQuery ajaxSubmit 实现ajax提交表单局部刷新
2016/07/04 Javascript
javascript之with的使用(阿里云、淘宝使用代码分析)
2016/10/11 Javascript
js仿QQ邮箱收件人选择与搜索功能
2017/02/10 Javascript
js实现不提示直接关闭网页窗口
2017/03/30 Javascript
Vue响应式原理详解
2017/04/18 Javascript
使用 Vue.js 仿百度搜索框的实例代码
2017/05/09 Javascript
vuex的使用及持久化state的方式详解
2018/01/23 Javascript
利用Console来Debug的10个高级技巧汇总
2018/03/26 Javascript
基于Vue实现关键词实时搜索高亮显示关键词
2018/07/21 Javascript
JavaScript栈和队列相关操作与实现方法详解
2018/12/07 Javascript
vue添加class样式实例讲解
2019/02/12 Javascript
Vue Router history模式的配置方法及其原理
2019/05/30 Javascript
koa中间件核心(koa-compose)源码解读分析
2020/06/15 Javascript
js实现验证码功能
2020/07/24 Javascript
[00:55]深扒TI7聊天轮盘语音出处3
2017/05/11 DOTA
Pycharm设置去除显示的波浪线方法
2018/10/28 Python
Django组件cookie与session的具体使用
2019/06/05 Python
pyhton中__pycache__文件夹的产生与作用详解
2019/11/24 Python
python通过文本在一个图中画多条线的实例
2020/02/21 Python
Kivari官网:在线购买波西米亚服装
2018/10/29 全球购物
预备党员转正材料
2014/12/19 职场文书
在NumPy中深拷贝和浅拷贝相关操作的定义和背后的原理
2022/04/14 Python