基于python中staticmethod和classmethod的区别(详解)


Posted in Python onOctober 24, 2017

例子

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.foo(1)
# executing foo(<__main__.A object at 0xb7dbef0c>,1)

-----------------------------------------------------------------

a.class_foo(1)
# executing class_foo(<class '__main__.A'>,1)

A.class_foo(1)
# executing class_foo(<class '__main__.A'>,1)

-----------------------------------------------------------------

a.static_foo(1)
# executing static_foo(1)

A.static_foo('hi')
# executing static_foo(hi)

区别

• foo()的调用者必须是类A的一个实例,class_foo()与static_foo()的调用者既可以是类也可以是某个实例

• 参数不同,foo() 参数为self和其他参数,class_foo()参数使用类(cls)替换了self,static_foo()则只有参数,没有self和类(cls)

• a.foo(1)中的foo()与a是绑定的,class_foo()是与类绑定的,而static_foo()与这两者都没有绑定,可以使用print来查看,如下:

```
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.class_foo
<bound method classobj.class_foo of >

print(a.static_foo)
# 
print(A.static_foo)
# 
```

作用

• 使用场景:classmethod在一些工厂类的情况下使用较多,也就是说OOP里继承的时候使用,staticmethod一般情况下可以替换为外部的函数,后者继承的时候不可更改,和C++/JAVA中的静态方法很相似

• 有利于组织代码,同时有利于命名空间的整洁

以上这篇基于python中staticmethod和classmethod的区别(详解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python处理csv数据动态显示曲线实例代码
Jan 23 Python
python tornado微信开发入门代码
Aug 24 Python
Python 创建新文件时避免覆盖已有的同名文件的解决方法
Nov 16 Python
对Python 简单串口收发GUI界面的实例详解
Jun 12 Python
Python+Selenium使用Page Object实现页面自动化测试
Jul 14 Python
运用PyTorch动手搭建一个共享单车预测器
Aug 06 Python
python opencv 图像边框(填充)添加及图像混合的实现方法(末尾实现类似幻灯片渐变的效果)
Mar 09 Python
django 链接多个数据库 并使用原生sql实现
Mar 28 Python
Python接收手机短信的代码整理
Aug 02 Python
Django多数据库联用实现方法解析
Nov 12 Python
Pandas 数据编码的十种方法
Apr 20 Python
Sentry的安装、配置、使用教程(Sentry日志手机系统)
Jul 23 Python
Flask数据库迁移简单介绍
Oct 24 #Python
python里使用正则表达式的组嵌套实例详解
Oct 24 #Python
Scrapy的简单使用教程
Oct 24 #Python
详解python里使用正则表达式的分组命名方式
Oct 24 #Python
在python中使用正则表达式查找可嵌套字符串组
Oct 24 #Python
python爬虫之BeautifulSoup 使用select方法详解
Oct 23 #Python
浅谈python中copy和deepcopy中的区别
Oct 23 #Python
You might like
火车头discuz6.1 完美采集的php接口文件
2009/09/13 PHP
美图秀秀web开放平台--PHP流式上传和表单上传示例分享
2014/06/22 PHP
2个Codeigniter文件批量上传控制器写法例子
2014/07/25 PHP
php第一次无法获取cookie问题处理
2014/12/15 PHP
php简单处理XML数据的方法示例
2017/05/19 PHP
yii2的restful api路由实例详解
2019/05/14 PHP
Javascript实现鼠标右键特色菜单
2015/08/04 Javascript
javascript函数命名的三种方式及区别介绍
2016/03/22 Javascript
基于AngularJs + Bootstrap + AngularStrap相结合实现省市区联动代码
2016/05/30 Javascript
JS模仿腾讯图片站的图片翻页按钮效果完整实例
2016/06/21 Javascript
JS制作类似选项卡切换的年历
2016/12/03 Javascript
详解vue数据渲染出现闪烁问题
2017/06/29 Javascript
详解vue.js数据传递以及数据分发slot
2018/01/20 Javascript
vue开发环境配置跨域的方法步骤
2019/01/16 Javascript
Vue 实现对quill-editor组件中的工具栏添加title
2020/08/03 Javascript
JavaScript快速调试的两个技巧
2020/11/04 Javascript
Vue+element-ui添加自定义右键菜单的方法示例
2020/12/08 Vue.js
python数据结构树和二叉树简介
2014/04/29 Python
Python采用raw_input读取输入值的方法
2014/08/18 Python
python使用PyGame播放Midi和Mp3文件的方法
2015/04/24 Python
简析Python的闭包和装饰器
2016/02/26 Python
微信 用脚本查看是否被微信好友删除
2016/10/28 Python
Django Rest framework认证组件详细用法
2019/07/25 Python
Python文字截图识别OCR工具实例解析
2020/03/05 Python
解决django的template中如果无法引用MEDIA_URL问题
2020/04/07 Python
戴尔英国官网:Dell英国
2017/05/27 全球购物
程序运行正确, 但退出时却"core dump"了,怎么回事
2014/02/19 面试题
在Ajax应用中信息是如何在浏览器和服务器之间传递的
2016/05/31 面试题
大学校运会广播稿
2014/02/03 职场文书
学校安全责任书范本
2014/07/23 职场文书
2014年仓库管理工作总结
2014/12/17 职场文书
个人工作年终总结
2015/03/09 职场文书
2015年办公室工作总结范文
2015/03/31 职场文书
勤俭节约主题班会
2015/08/13 职场文书
新年寄语2016
2015/08/17 职场文书
2015年高三毕业班班主任工作总结
2015/10/22 职场文书