详解Python中@staticmethod和@classmethod区别及使用示例代码


Posted in Python onDecember 14, 2020

本文主要介绍Python中,class(类)的装饰器@staticmethod和@classmethod的使用示例代码和它们的区别。

1、@staticmethod和@classmethod区别

@staticmethod:静态方法

@classmethod:类方法

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

而使用@staticmethod或@classmethod,就可以不需要实例化,直接通过类名就可以实现调用

使用:直接类名.方法名()来调用。@staticmethod和@classmethod都可以直接类名.方法名()来调用,

@staticmethod不需要表示自身对象的self和自身类的cls参数(这两个参数都不需要添加),就跟使用函数一样。

使用:直接类名.属性名或直接类名.方法名。

@classmethod也不需要self参数,但第一个参数需要是表示自身类的cls参数。

使用:直接类名.属性名或直接类名.方法名。

两者定义的装饰器调用方法一样,但是@classmethod装饰器定义的类方法需要传入类参数cls。

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

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

2、@staticmethod和@classmethod使用示例代码

class A(object):
  def foo(self, x):
    print "executing foo(%s, %s)" % (self, x)
  @classmethod
  def class_foo(cls, x):
    print "executing class_foo(%s, %s)" % (cls, x)
  @staticmethod
  def static_foo(x):
    print "executing static_foo(%s)" % x  
a = A()
#通过实例调用方法,对象实例a作为第一个参数隐式传递。
a.foo (1)
# executing foo(<__main__.A object at 0xb7dbef0c>,1)
#对于类方法,对象实例的类将隐式地作为第一个参数而不是传递self
a.class_foo(1)
# executing class_foo(<class '__main__.A'>,1)
#使用这个类调用class_foo
A.class_foo(1)
# executing class_foo(<class '__main__.A'>,1)
#对于staticmethods,self(对象实例)和cls(类)都不会作为第一个参数隐式传递。它们的行为类似普通函数,除了你可以从实例或类中调用它们
a.static_foo(1)
# executing static_foo(1)
A.static_foo('hi')
# executing static_foo(hi)
print(a.foo)
# <bound method A.foo of <__main__.A object at 0xb7d52f0c>>
print(a.class_foo)
# <bound method type.class_foo of <class '__main__.A'>>
print(a.static_foo)
# <function static_foo at 0xb7d479cc>
print(a.static_foo)
# <function static_foo at 0xb7d479cc>

总结一下彼此的调用区别:

详解Python中@staticmethod和@classmethod区别及使用示例代码

到此这篇关于详解Python中@staticmethod和@classmethod区别及使用示例代码的文章就介绍到这了,更多相关Python @staticmethod和@classmethod内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python显示生日是星期几的方法
May 27 Python
利用pyinstaller或virtualenv将python程序打包详解
Mar 22 Python
在django中使用自定义标签实现分页功能
Jul 04 Python
快速查询Python文档方法分享
Dec 27 Python
pandas 实现字典转换成DataFrame的方法
Jul 04 Python
mvc框架打造笔记之wsgi协议的优缺点以及接口实现
Aug 01 Python
python实现实时视频流播放代码实例
Jan 11 Python
python为Django项目上的每个应用程序创建不同的自定义404页面(最佳答案)
Mar 09 Python
浅谈django 重载str 方法
May 19 Python
使用Python pip怎么升级pip
Aug 11 Python
python pyhs2 的安装操作
Apr 07 Python
浅谈Python 中的复数问题
May 19 Python
Python 找出英文单词列表(list)中最长单词链
Dec 14 #Python
Python 排序最长英文单词链(列表中前一个单词末字母是下一个单词的首字母)
Dec 14 #Python
Python实现Kerberos用户的增删改查操作
Dec 14 #Python
python-地图可视化组件folium的操作
Dec 14 #Python
python多线程和多进程关系详解
Dec 14 #Python
Python Pandas list列表数据列拆分成多行的方法实现
Dec 14 #Python
pandas将list数据拆分成行或列的实现
Dec 13 #Python
You might like
MYSQL数据库初学者使用指南
2006/11/16 PHP
默默小谈PHP&amp;MYSQL分页原理及实现
2007/01/02 PHP
php中用加号与用array_merge合并数组的区别深入分析
2013/06/03 PHP
php的SimpleXML方法读写XML接口文件实例解析
2014/06/16 PHP
php简单操作mysql数据库的类
2015/04/16 PHP
jQuery对象和DOM对象使用说明
2010/06/25 Javascript
JavaScript自定义事件介绍
2013/08/29 Javascript
使用typeof判断function是否存在于上下文
2014/08/14 Javascript
jquery实现在光标位置插入内容的方法
2015/02/05 Javascript
运行Node.js的IIS扩展iisnode安装配置笔记
2015/03/02 Javascript
Bootstrap每天必学之缩略图与警示窗
2015/11/29 Javascript
通过jquery-ui中的sortable来实现拖拽排序的简单实例
2016/05/24 Javascript
JavaScript中数组的各种操作的总结(必看篇)
2017/02/13 Javascript
jQuery事件与动画基础详解
2017/02/23 Javascript
微信小程序 flex实现导航实例详解
2017/04/26 Javascript
vue2 自定义动态组件所遇到的问题
2017/06/08 Javascript
如何让你的JS代码更好看易读
2017/12/01 Javascript
vue2.0页面前进刷新回退不刷新的实现方法
2018/07/31 Javascript
vue使用Proxy实现双向绑定的方法示例
2019/03/20 Javascript
微信小程序实现原生步骤条
2019/07/25 Javascript
解决layui的radio属性或别的属性没显示出来的问题
2019/09/26 Javascript
vue计算属性+vue中class与style绑定(推荐)
2020/03/30 Javascript
vue将data恢复到初始状态 &amp;&amp; 重新渲染组件实例
2020/09/04 Javascript
[23:18]Spirit vs Liquid Supermajor小组赛A组 BO3 第二场 6.2
2018/06/03 DOTA
Python 正则表达式入门(初级篇)
2016/12/07 Python
如何通过50行Python代码获取公众号全部文章
2019/07/12 Python
VSCode中自动为Python文件添加头部注释
2019/11/14 Python
使用tensorflow显示pb模型的所有网络结点方式
2020/01/23 Python
Python word文本自动化操作实现方法解析
2020/11/05 Python
Python实现小黑屋游戏的完整实例
2021/01/06 Python
html5 视频播放解决方案
2016/11/06 HTML / CSS
美国最大点评网站:Yelp
2018/02/14 全球购物
运动会解说词100字
2014/01/31 职场文书
如何写好开幕词?
2019/06/24 职场文书
VUE使用draggable实现组件拖拽
2022/04/06 Vue.js
解决Windows Server2012 R2 无法安装 .NET Framework 3.5
2022/04/29 Servers