详解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 字典(Dictionary)操作详解
Mar 11 Python
python轻松实现代码编码格式转换
Mar 26 Python
python获取本地计算机名字的方法
Apr 29 Python
在Python的Django框架中显示对象子集的方法
Jul 21 Python
Python环境变量设置方法
Aug 28 Python
使用pandas中的DataFrame数据绘制柱状图的方法
Apr 10 Python
使用python批量化音乐文件格式转换的实例
Jan 09 Python
python基础知识(一)变量与简单数据类型详解
Apr 17 Python
Python中的正则表达式与JSON数据交换格式
Jul 03 Python
Python单元测试模块doctest的具体使用
Feb 10 Python
python+pygame实现坦克大战小游戏的示例代码(可以自定义子弹速度)
Aug 11 Python
Python中的面向接口编程示例详解
Jan 17 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
PHP5 安装方法
2007/01/15 PHP
Gregarius中文日期格式问题解决办法
2008/04/22 PHP
php基于curl主动推送最新内容给百度收录的方法
2016/10/14 PHP
PHP获取对象属性的三种方法实例分析
2019/01/03 PHP
Yii框架数据库查询、增加、删除操作示例
2019/10/14 PHP
如何取得中文输入的真实长度?
2006/06/24 Javascript
Jquery 跨域访问 Lightswitch OData Service的方法
2013/09/11 Javascript
js获取上传文件大小示例代码
2014/04/10 Javascript
字段太多jquey快速清空表单内容方法
2014/08/21 Javascript
jQuery实现径向动画菜单效果
2015/07/17 Javascript
深入探秘jquery瀑布流的实现
2016/01/30 Javascript
JavaScript的Backbone.js框架环境搭建及Hellow world示例
2016/05/07 Javascript
实例解析jQuery工具函数
2016/12/01 Javascript
详解微信小程序Radio选中样式切换
2017/07/06 Javascript
浅谈MUI框架中加载外部网页或服务器数据的方法
2018/01/31 Javascript
vue中Element-ui 输入银行账号每四位加一个空格的实现代码
2018/09/14 Javascript
在vue中使用G2图表的示例代码
2019/03/19 Javascript
js实现碰撞检测
2021/01/29 Javascript
[54:58]完美世界DOTA2联赛PWL S2 LBZS vs Rebirth 第一场 11.25
2020/11/25 DOTA
python实现的文件夹清理程序分享
2014/11/22 Python
Python编程中实现迭代器的一些技巧小结
2016/06/21 Python
flask中使用蓝图将路由分开写在不同文件实例解析
2018/01/19 Python
Python使用matplotlib绘制随机漫步图
2018/08/27 Python
python实时检测键盘输入函数的示例
2019/07/17 Python
Python numpy多维数组实现原理详解
2020/03/10 Python
pycharm全局搜索的具体步骤
2020/07/28 Python
基于css3 animate制作绚丽的动画效果
2015/11/24 HTML / CSS
哥伦比亚加拿大官网:Columbia Sportswear Canada
2020/09/07 全球购物
毕业生应聘幼儿园的自荐信
2013/11/20 职场文书
元旦晚会感言
2014/03/12 职场文书
学校师德承诺书
2014/05/23 职场文书
新教师岗前培训方案
2014/06/05 职场文书
文艺演出策划方案
2014/06/07 职场文书
高一课前三分钟演讲稿
2014/09/13 职场文书
Python 中数组和数字相乘时的注意事项说明
2021/05/10 Python
tree shaking对打包体积优化及作用
2022/07/07 Java/Android