详解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中的sort方法使用详解
Jul 25 Python
python简单文本处理的方法
Jul 10 Python
Python中的FTP通信模块ftplib的用法整理
Jul 08 Python
Python简单删除列表中相同元素的方法示例
Jun 12 Python
python+selenium打印当前页面的titl和url方法
Jun 22 Python
对python添加模块路径的三种方法总结
Oct 16 Python
python实现对任意大小图片均匀切割的示例
Dec 05 Python
Python 多维List创建的问题小结
Jan 18 Python
Python函数的默认参数设计示例详解
Dec 01 Python
python Jupyter运行时间实例过程解析
Dec 13 Python
一文轻松掌握python语言命名规范规则
Jun 18 Python
python基础之爬虫入门
May 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的Yii框架中登陆功能的实现
2015/08/21 PHP
搭建自己的PHP MVC框架详解
2017/08/16 PHP
PHP单例模式与工厂模式详解
2017/08/29 PHP
php实现大文件断点续传下载实例代码
2019/10/01 PHP
Thinkphp5+Redis实现商品秒杀代码实例讲解
2020/12/29 PHP
javaScript Array(数组)相关方法简述
2009/07/25 Javascript
javascript中简单的进制转换代码实例
2013/10/26 Javascript
Event altKey,ctrlKey,shiftKey属性解析
2013/12/18 Javascript
jquery实现点击文字可编辑并修改保存至数据库
2014/04/15 Javascript
JavaScript中Number.MAX_VALUE属性的使用方法
2015/06/04 Javascript
jquery实现无刷新验证码的简单实例
2016/05/19 Javascript
vuejs使用$emit和$on进行组件之间的传值的示例
2017/10/04 Javascript
微信小程序wx:for和wx:for-item的用法详解
2018/04/01 Javascript
深入浅析Vue全局组件与局部组件的区别
2018/06/15 Javascript
Angular2实现的秒表及改良版示例
2019/05/10 Javascript
CKEditor 4.4.1 添加代码高亮显示插件功能教程【使用官方推荐Code Snippet插件】
2019/06/14 Javascript
基于jQuery实现可编辑的表格
2019/12/11 jQuery
深入浅析python 中的匿名函数
2018/05/21 Python
eclipse创建python项目步骤详解
2019/05/10 Python
Python 的AES加密与解密实现
2019/07/09 Python
Python 网络编程之UDP发送接收数据功能示例【基于socket套接字】
2019/10/11 Python
详解基于python的全局与局部序列比对的实现(DNA)
2020/10/07 Python
中国首家奢侈品O2O网购平台:第五大道奢侈品网
2017/12/14 全球购物
北京振戎融通Java面试题
2015/09/03 面试题
如何理解transaction事务的概念
2015/05/27 面试题
《临死前的严监生》教学反思
2014/02/13 职场文书
公司活动方案范文
2014/03/06 职场文书
护理专业学生职业生涯规划范文
2014/03/11 职场文书
学习演讲稿范文
2014/05/10 职场文书
个人授权委托书格式
2014/08/30 职场文书
加薪申请书应该这样写!
2019/07/04 职场文书
2019年国庆祝福语(70句)
2019/09/19 职场文书
PHP连接MSSQL数据库案例,PHPWAMP多个PHP版本连接SQL Server数据库
2021/04/16 PHP
CSS完成视差滚动效果
2021/04/27 HTML / CSS
24年收藏2000多部退役军用电台
2022/02/18 无线电
Android自定义双向滑动控件
2022/04/19 Java/Android