详解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 相关文章推荐
win7安装python生成随机数代码分享
Dec 27 Python
python xml解析实例详解
Nov 14 Python
Python贪吃蛇游戏编写代码
Oct 26 Python
python3学习之Splash的安装与实例教程
Jul 09 Python
如何在python中写hive脚本
Nov 08 Python
python 实现在无序数组中找到中位数方法
Mar 03 Python
python不相等的两个字符串的 if 条件判断为True详解
Mar 12 Python
Python中的__init__作用是什么
Jun 09 Python
如何用Matplotlib 画三维图的示例代码
Jul 28 Python
Python获取指定网段正在使用的IP
Dec 14 Python
使用Python实现音频双通道分离
Dec 25 Python
详解python日志输出使用配置文件格式
Feb 10 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中获取关键词及所属来源搜索引擎名称的代码
2011/02/15 PHP
详解WordPress中创建和添加过滤器的相关PHP函数
2015/12/29 PHP
thinkphp中的多表关联查询的实例详解
2017/10/12 PHP
laravel 获取当前url的别名方法
2019/10/11 PHP
laravel框架实现去掉URL中index.php的方法
2019/10/12 PHP
PHP+ajax实现上传、删除、修改单张图片及后台处理逻辑操作详解
2020/02/12 PHP
jquery 3D球状导航的文章分类
2010/07/06 Javascript
jQuery多项选项卡的实现思路附样式及代码
2014/06/03 Javascript
详解JavaScript编程中正则表达式的使用
2015/10/25 Javascript
JS提示:Uncaught SyntaxError:Unexpected token ) 错误的解决方法
2016/08/19 Javascript
js print打印网页指定区域内容的简单实例
2016/11/01 Javascript
js匿名函数使用&amp;传参(实例)
2017/09/08 Javascript
vue mint-ui tabbar变组件使用
2018/05/04 Javascript
在Python中使用SimpleParse模块进行解析的教程
2015/04/11 Python
Django imgareaselect手动剪切头像实现方法
2015/05/26 Python
python 捕获 shell/bash 脚本的输出结果实例
2017/01/04 Python
python输出100以内的质数与合数实例代码
2018/07/08 Python
Python实现深度遍历和广度遍历的方法
2019/01/22 Python
Django用户认证系统 组与权限解析
2019/08/02 Python
Python 导入文件过程图解
2019/10/15 Python
Python-openCV开运算实例
2020/07/05 Python
了解一下python内建模块collections
2020/09/07 Python
python工具——Mimesis的简单使用教程
2021/01/16 Python
Jo Malone美国官网:祖玛珑香水
2017/03/27 全球购物
最新计算机专业自荐信
2013/10/16 职场文书
事业单位竞聘上岗实施方案
2014/03/28 职场文书
村抢险救灾方案
2014/05/09 职场文书
公共艺术专业自荐信
2014/09/01 职场文书
代收款委托书范本
2014/10/01 职场文书
离婚财产分隔协议书
2014/10/23 职场文书
2015年党建工作目标责任书
2015/05/08 职场文书
公司员工宿舍管理制度
2015/08/03 职场文书
Python一行代码实现自动发邮件功能
2021/05/30 Python
浅谈Python中的正则表达式
2021/06/28 Python
上个世纪50年代的可穿戴技术:无线电帽子
2022/02/18 无线电
高性能跳频抗干扰宽带自组网电台
2022/02/18 无线电