详解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 相关文章推荐
selenium+python实现自动登录脚本
Apr 22 Python
解决python 未发现数据源名称并且未指定默认驱动程序的问题
Dec 07 Python
对IPython交互模式下的退出方法详解
Feb 16 Python
Python实现去除列表中重复元素的方法总结【7种方法】
Feb 16 Python
Django生成PDF文档显示在网页上以及解决PDF中文显示乱码的问题
Jul 04 Python
Python实现Mysql数据统计及numpy统计函数
Jul 15 Python
python gdal安装与简单使用
Aug 01 Python
Django REST framwork的权限验证实例
Apr 02 Python
Python爬虫爬取博客实现可视化过程解析
Jun 29 Python
python 如何实现遗传算法
Sep 22 Python
如何解决python多种版本冲突问题
Oct 13 Python
Django项目如何正确配置日志(logging)
Apr 29 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语法(5)
2006/10/09 PHP
php 运行效率总结(提示程序速度)
2009/11/26 PHP
记录一次排查PHP脚本执行卡住的问题
2016/12/27 PHP
PHP SESSION机制的理解与实例
2019/03/22 PHP
Chrome Form多次提交表单问题的解决方法
2011/05/09 Javascript
javascript判断变量是否有值的方法
2015/04/20 Javascript
JavaScript实现自动消除按钮功能的方法
2015/08/05 Javascript
浅谈js和css内联外联注意事项
2016/06/30 Javascript
探究JavaScript中的五种事件处理程序方式
2016/12/07 Javascript
javascript 注释代码的几种方法总结
2017/01/04 Javascript
Vue中父子组件通讯之todolist组件功能开发
2018/05/21 Javascript
JavaScript递归函数解“汉诺塔”算法代码解析
2018/07/05 Javascript
基于Vue+element-ui 的Table二次封装的实现
2018/07/20 Javascript
vue实现动态按钮功能
2019/05/13 Javascript
Python中除法使用的注意事项
2014/08/21 Python
python Django批量导入不重复数据
2016/03/25 Python
Python序列化基础知识(json/pickle)
2017/10/19 Python
Python实现霍夫圆和椭圆变换代码详解
2018/01/12 Python
Python处理菜单消息操作示例【基于win32ui模块】
2018/05/09 Python
对pandas里的loc并列条件索引的实例讲解
2018/11/15 Python
python opencv进行图像拼接
2020/03/27 Python
Python3实现英文字母转换哥特式字体实例代码
2020/09/01 Python
Numpy实现卷积神经网络(CNN)的示例
2020/10/09 Python
SmartBuyGlasses英国:购买太阳镜和眼镜
2018/01/29 全球购物
LEGO玩具英国官方商店:LEGO Shop GB
2018/03/27 全球购物
轻松制作精彩视频:Animoto
2018/09/19 全球购物
全球高级音频和视频专家:HiDef Lifestyle
2019/08/02 全球购物
工程师岗位职责
2013/11/08 职场文书
办公自动化专业大学生职业规划书
2014/03/06 职场文书
2014领导班子四风问题对照检查材料思想汇报
2014/09/21 职场文书
2014入党积极分子批评与自我批评思想报告
2014/10/06 职场文书
黄山导游词
2015/01/31 职场文书
九华山导游词
2015/02/03 职场文书
毕业证明模板
2015/06/19 职场文书
python中Tkinter 窗口之输入框和文本框的实现
2021/04/12 Python
Python实现灰色关联分析与结果可视化的详细代码
2022/03/25 Python