基于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实现实例
Apr 26 Python
Python使用tablib生成excel文件的简单实现方法
Mar 16 Python
浅析Python基础-流程控制
Mar 18 Python
Django框架自定义session处理操作示例
May 27 Python
pyqt5使用按钮进行界面的跳转方法
Jun 19 Python
Python3显示当前时间、计算时间差及时间加减法示例代码
Sep 07 Python
python使用正则表达式去除中文文本多余空格,保留英文之间空格方法详解
Feb 11 Python
Django如何使用jwt获取用户信息
Apr 21 Python
keras 多任务多loss实例
Jun 22 Python
Python 抓取数据存储到Redis中的操作
Jul 16 Python
利用Python实现Json序列化库的方法步骤
Sep 09 Python
python实现对doc、txt、xls等文档的读写操作
Apr 02 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
PHP 读取文件的正确方法
2009/04/29 PHP
Yii实现多数据库主从读写分离的方法
2014/12/29 PHP
codeigniter中实现一次性加载多个view的方法
2015/03/20 PHP
PHP 7安装调试工具Xdebug扩展的方法教程
2017/06/17 PHP
利用php操作memcache缓存的基础方法示例
2017/08/02 PHP
在javascript中关于节点内容加强
2013/04/11 Javascript
JavaScript事件委托实例分析
2015/05/26 Javascript
Javascript实现div层渐隐效果的方法
2015/05/30 Javascript
JSON字符串转JSON对象
2015/07/31 Javascript
浅谈javascript的Touch事件
2015/09/27 Javascript
微信小程序 swiper组件详解及实例代码
2016/10/25 Javascript
vuedraggable+element ui实现页面控件拖拽排序效果
2020/07/29 Javascript
JS实现简易留言板增删功能
2020/02/08 Javascript
Vue.js中使用Vuex实现组件数据共享案例
2020/07/31 Javascript
解决Vue watch里调用方法的坑
2020/11/07 Javascript
[02:41]DOTA2亚洲邀请赛小组赛第三日 赛事回顾
2015/02/01 DOTA
Java多线程编程中ThreadLocal类的用法及深入
2016/06/21 Python
Python 打印中文字符的三种方法
2018/08/14 Python
Python发展简史 Python来历
2019/05/14 Python
python爬虫豆瓣网的模拟登录实现
2019/08/21 Python
15款Python编辑器的优缺点,别再问我“选什么编辑器”啦
2020/10/19 Python
解决Pyinstaller打包软件失败的一个坑
2021/03/04 Python
Python是如何进行类型转换的
2013/06/09 面试题
J2EE的优越性主要表现在哪些方面
2016/03/28 面试题
大学生写自荐信的技巧
2014/01/08 职场文书
软件部经理岗位职责范本
2014/02/25 职场文书
我的画教学反思
2014/04/28 职场文书
搞笑爱情保证书
2014/04/29 职场文书
工作说明书范文
2014/05/07 职场文书
中文专业求职信
2014/06/20 职场文书
元旦晚会活动总结
2014/07/09 职场文书
2014年网络管理员工作总结
2014/12/01 职场文书
2015年文员个人工作总结
2015/04/09 职场文书
病危通知单
2015/04/17 职场文书
社区法制宣传月活动总结
2015/05/07 职场文书
学雷锋广播稿大全
2015/08/19 职场文书