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的一些用法分享
Oct 07 Python
回调函数的意义以及python实现实例
Jun 20 Python
Tensorflow之构建自己的图片数据集TFrecords的方法
Feb 07 Python
对Python中DataFrame按照行遍历的方法
Apr 08 Python
python中int与str互转方法
Jul 02 Python
详解Python读取yaml文件多层菜单
Mar 23 Python
python print出共轭复数的方法详解
Jun 25 Python
用python3 urllib破解有道翻译反爬虫机制详解
Aug 14 Python
用Python调用win命令行提高工作效率的实例
Aug 14 Python
python numpy库linspace相同间隔采样的实现
Feb 25 Python
Python离线安装各种库及pip的方法
Nov 28 Python
python爬虫之利用selenium模块自动登录CSDN
Apr 22 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
PHP序列号生成函数和字符串替换函数代码
2012/06/07 PHP
php实现多城市切换特效
2015/08/09 PHP
最新制作ThinkPHP3.2.3完全开发手册
2015/11/23 PHP
php事件驱动化设计详解
2016/11/10 PHP
ajax调用返回php接口返回json数据的方法(必看篇)
2017/05/05 PHP
yii2 上传图片的示例代码
2018/11/02 PHP
用Javascript来生成ftp脚本的小例子
2013/07/03 Javascript
jQuery实现类似滑动门切换效果的层切换
2013/09/23 Javascript
弹出最简单的模式化遮罩层的js代码
2013/12/04 Javascript
jquery跨域请求示例分享(jquery发送ajax请求)
2014/03/25 Javascript
javascript实现数组中的内容随机输出
2015/08/11 Javascript
JavaScript中windows.open()、windows.close()方法详解
2016/07/28 Javascript
Vue.js组件tree实现无限级树形菜单
2016/12/02 Javascript
weui框架实现上传、预览和删除图片功能代码
2017/08/24 Javascript
扫微信小程序码实现网站登陆实现解析
2019/08/20 Javascript
jquery自定义组件实例详解
2020/12/31 jQuery
python使用wmi模块获取windows下硬盘信息的方法
2015/05/15 Python
python批量解压zip文件的方法
2019/08/20 Python
Python 实现opencv所使用的图片格式与 base64 转换
2020/01/09 Python
python itsdangerous模块的具体使用方法
2020/02/17 Python
Idea安装python显示无SDK问题解决方案
2020/08/12 Python
印尼在线精品店:Berrybenka.com
2016/10/22 全球购物
美国演唱会订票网站:Ticketmaster美国
2017/10/05 全球购物
Stubhub英国:购买体育、演唱会和剧院门票
2018/06/10 全球购物
Internal修饰符有什么含义
2013/07/10 面试题
公司股权转让协议书
2014/04/12 职场文书
老公给老婆的保证书
2014/04/28 职场文书
绿色出行口号
2014/06/18 职场文书
中职三好学生事迹材料
2014/08/24 职场文书
中华在我心中演讲稿
2014/09/13 职场文书
工作犯错保证书
2015/05/11 职场文书
预备党员考察表党小组意见
2015/06/01 职场文书
Python如何把不同类型数据的json序列化
2021/04/30 Python
pytorch中的model.eval()和BN层的使用
2021/05/22 Python
详解Redis瘦身指南
2021/05/26 Redis
css如何把元素固定在容器底部的四种方式
2022/06/16 HTML / CSS