详解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 相关文章推荐
windows下安装python paramiko模块的代码
Feb 10 Python
Python2.x中str与unicode相关问题的解决方法
Mar 30 Python
为Python的web框架编写前端模版的教程
Apr 30 Python
解决python3 urllib中urlopen报错的问题
Mar 25 Python
python实现发送邮件及附件功能
Mar 02 Python
Python实现的维尼吉亚密码算法示例
Apr 12 Python
Python实现对文件进行单词划分并去重排序操作示例
Jul 10 Python
20行python代码的入门级小游戏的详解
May 05 Python
Python实现爬取亚马逊数据并打印出Excel文件操作示例
May 16 Python
opencv转换颜色空间更改图片背景
Aug 20 Python
win10安装tensorflow-gpu1.8.0详细完整步骤
Jan 20 Python
python中子类与父类的关系基础知识点
Feb 02 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实现中文圆形印章特效
2015/06/19 PHP
ThinkPHP3.2.2实现持久登录(记住我)功能的方法
2016/05/16 PHP
PHP的AES加密算法完整实例
2016/07/20 PHP
mac系统下为 php 添加 pcntl 扩展
2016/08/28 PHP
详谈PHP中public,private,protected,abstract等关键字的用法
2017/12/31 PHP
PHP基于GD2函数库实现验证码功能示例
2019/01/27 PHP
PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
2019/11/19 PHP
Extjs学习笔记之一 初识Extjs之MessageBox
2010/01/07 Javascript
JavaScript 类的定义和引用 JavaScript高级培训 自定义对象
2010/04/27 Javascript
JavaScript游戏之优化篇
2010/11/08 Javascript
javascript错误的认识不用关心内存管理
2012/12/15 Javascript
js 回车提交表单两种实现方法
2012/12/31 Javascript
js操作table示例(个人心得)
2013/11/29 Javascript
JS和JQUERY获取页面大小,滚动条位置,元素位置(示例代码)
2013/12/14 Javascript
js获取时间函数及扩展函数的方法
2016/10/30 Javascript
利用JS实现简单的日期选择插件
2017/01/23 Javascript
使用BootStrap实现标签切换原理解析
2017/03/14 Javascript
js脚本编写简单刷票投票系统
2017/06/27 Javascript
老生常谈js中的MVC
2017/07/25 Javascript
VUE重点问题总结
2018/03/19 Javascript
JavaScript使用闭包模仿块级作用域操作示例
2019/01/21 Javascript
JavaScript实现页面高亮操作提示和蒙板
2021/01/04 Javascript
[01:15]《辉夜杯》北京网鱼队巡礼
2015/10/26 DOTA
[00:32]DOTA2上海特级锦标赛 COL战队宣传片
2016/03/04 DOTA
Python BeautifulReport可视化报告代码实例
2020/04/13 Python
越南母婴用品购物网站:Kids Plaza
2020/04/09 全球购物
国际经济贸易专业推荐信
2013/11/06 职场文书
金属材料工程毕业生个人的自我评价
2013/11/28 职场文书
高中的自我鉴定
2013/12/16 职场文书
电气工程师岗位职责
2014/01/01 职场文书
《鞋匠的儿子》教学反思
2014/03/02 职场文书
机关作风整顿个人整改措施2014
2014/09/17 职场文书
2014年消防工作总结
2014/11/21 职场文书
2014年社区宣传工作总结
2014/12/02 职场文书
给客户的检讨书
2014/12/21 职场文书
2015年中秋节主持词
2015/07/30 职场文书