详解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利用hook技术破解https的实例代码
Mar 25 Python
Python入门及进阶笔记 Python 内置函数小结
Aug 09 Python
python基础教程之对象和类的实际运用
Aug 29 Python
使用Python的Twisted框架构建非阻塞下载程序的实例教程
May 25 Python
python的random模块及加权随机算法的python实现方法
Jan 04 Python
详细解读tornado协程(coroutine)原理
Jan 15 Python
Python3.5基础之NumPy模块的使用图文与实例详解
Apr 24 Python
Python企业编码生成系统总体系统设计概述
Jul 26 Python
实例详解Python装饰器与闭包
Jul 29 Python
pytorch方法测试详解——归一化(BatchNorm2d)
Jan 15 Python
python wav模块获取采样率 采样点声道量化位数(实例代码)
Jan 22 Python
写好Python代码的几条重要技巧
May 21 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 防恶意刷新实现代码
2010/05/16 PHP
基于PHP5魔术常量与魔术方法的详解
2013/06/13 PHP
AJAX的跨域访问-两种有效的解决方法介绍
2013/06/22 PHP
PHP的文件操作与算法实现的面试题示例
2015/08/10 PHP
浅谈PHP中静态方法和非静态方法的相互调用
2016/10/04 PHP
使用php完成常见的文件上传功能(推荐)
2017/01/13 PHP
JavaScript中也使用$美元符号来代替document.getElementById
2010/06/19 Javascript
20个最新的jQuery插件
2012/01/13 Javascript
基于jquery实现动态竖向柱状条特效
2016/02/12 Javascript
限制只能输入数字的实现代码
2016/05/16 Javascript
JS实现输入框提示文字点击时消失效果
2016/07/19 Javascript
JAVA中截取字符串substring用法详解
2017/04/14 Javascript
Bootstrap进度条与AJAX后端数据传递结合使用实例详解
2017/04/23 Javascript
label+input实现按钮开关切换效果的实例
2017/08/16 Javascript
JavaScript使用享元模式实现文件上传优化操作示例
2018/08/07 Javascript
浅谈JavaScript闭包
2019/04/09 Javascript
深入解析微信小程序开发中遇到的几个小问题
2020/07/11 Javascript
js代码编写无缝轮播图
2020/09/13 Javascript
详解nginx配置vue h5 history去除#号
2020/11/09 Javascript
python如何去除字符串中不想要的字符
2020/07/05 Python
Python基于whois模块简单识别网站域名及所有者的方法
2018/04/23 Python
Win10下python3.5和python2.7环境变量配置教程
2018/09/18 Python
Django中的AutoField字段使用
2020/05/18 Python
教你使用Canvas处理图片的方法
2017/11/28 HTML / CSS
Reebok俄罗斯官方网上商店:购买锐步运动服装和鞋子
2016/09/26 全球购物
惠普墨西哥官方商店:HP墨西哥
2016/12/01 全球购物
Linux面试题LINUX系统类
2015/11/25 面试题
2014医学院领导班子对照检查材料思想汇报
2014/09/19 职场文书
教师正风肃纪剖析材料
2014/10/20 职场文书
十月围城观后感
2015/06/08 职场文书
小学一年级数学教学反思
2016/02/16 职场文书
2016年共产党员个人承诺书
2016/03/24 职场文书
nginx限制并发连接请求数的方法
2021/04/01 Servers
python疲劳驾驶困倦低头检测功能的实现
2022/04/04 Python
java中如何截取字符串最后一位
2022/07/07 Java/Android
MySQL 原理与优化之Update 优化
2022/08/14 MySQL