详解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查找目录下指定扩展名的文件实例
Apr 01 Python
Python读写ini文件的方法
May 28 Python
Python内置数据结构与操作符的练习题集锦
Jul 01 Python
使用apidocJs快速生成在线文档的实例讲解
Feb 07 Python
Python抓取聚划算商品分析页面获取商品信息并以XML格式保存到本地
Feb 23 Python
python文件操作之批量修改文件后缀名的方法
Aug 10 Python
Python补齐字符串长度的实例
Nov 15 Python
Python使用到第三方库PyMuPDF图片与pdf相互转换
May 03 Python
使用Python代码实现Linux中的ls遍历目录命令的实例代码
Sep 07 Python
python判断一个变量是否已经设置的方法
Aug 13 Python
python 两种方法修改文件的创建时间、修改时间、访问时间
Sep 26 Python
Python项目打包成二进制的方法
Dec 30 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
PHP安全技术之 实现php基本安全
2010/09/04 PHP
php无限分类且支持输出树状图的详细介绍
2013/06/19 PHP
smarty模板局部缓存方法使用示例
2014/06/17 PHP
PHP实现页面静态化深入讲解
2021/03/04 PHP
Extjs EditorGridPanel中ComboBox列的显示问题
2011/07/04 Javascript
javascript动画对象支持加速、减速、缓入、缓出的实现代码
2012/09/30 Javascript
利用JQuery动画制作滑动菜单项效果实现步骤及代码
2013/02/07 Javascript
JavaScript实现基于Cookie的存储类实例
2015/04/10 Javascript
JS定时器使用,定时定点,固定时刻,循环执行详解
2016/05/31 Javascript
jQuery实现圣诞节礼物动画案例解析
2016/12/25 Javascript
js仿iphone秒表功能 计算平均数
2017/01/11 Javascript
ng-options和ng-checked在表单中的高级运用(推荐)
2017/01/21 Javascript
HTML5+Canvas调用手机拍照功能实现图片上传(上)
2017/04/21 Javascript
基于Vue.js实现tab滑块效果
2017/07/23 Javascript
AngularJs 禁止模板缓存的方法
2017/11/28 Javascript
Vue结合Video.js播放m3u8视频流的方法示例
2018/05/04 Javascript
微信小程序自定义组件实现tabs选项卡功能
2018/07/14 Javascript
详解如何构建Promise队列实现异步函数顺序执行
2018/10/23 Javascript
小程序中英文混合排序问题解决
2019/08/02 Javascript
JavaScript经典案例之简易计算器
2020/08/24 Javascript
Python Tkinter基础控件用法
2014/09/03 Python
WINDOWS 同时安装 python2 python3 后 pip 错误的解决方法
2017/03/16 Python
python sys.argv[]用法实例详解
2018/05/25 Python
python脚本当作Linux中的服务启动实现方法
2019/06/28 Python
Python小程序之在图片上加入数字的代码
2019/11/26 Python
html5使用Canvas绘图的使用方法
2017/11/21 HTML / CSS
HTML5 Canvas 绘图——使用 Canvas 绘制图形图文教程 使用html5 canvas 绘制精美的图
2015/08/31 HTML / CSS
草莓网美国官网:Strawberrynet USA
2016/12/11 全球购物
瑞士首家网上药店折扣店:McDrogerie
2020/12/22 全球购物
党建目标管理责任书
2014/07/25 职场文书
员工激励培训演讲稿
2014/09/16 职场文书
2014年度考核工作总结
2014/12/24 职场文书
单位收入证明范本
2015/06/18 职场文书
go 实现简易端口扫描的示例
2021/05/22 Golang
springboot 启动如何排除某些bean的注入
2021/08/02 Java/Android
电脑无法安装Windows 11怎么办?无法安装Win11的解决方法
2021/11/21 数码科技