基于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操作字符串之rindex()方法的使用
May 19 Python
在Django框架中运行Python应用全攻略
Jul 17 Python
Python闭包之返回函数的函数用法示例
Jan 27 Python
python多进程使用及线程池的使用方法代码详解
Oct 24 Python
Python装饰器简单用法实例小结
Dec 03 Python
python2.7使用plotly绘制本地散点图和折线图
Apr 02 Python
局域网内python socket实现windows与linux间的消息传送
Apr 19 Python
解决安装pyqt5之后无法打开spyder的问题
Dec 13 Python
Numpy之reshape()使用详解
Dec 26 Python
解决python replace函数替换无效问题
Jan 18 Python
python定义类self用法实例解析
Jan 22 Python
使用Python实现牛顿法求极值
Feb 10 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
windows下安装php的memcache模块的方法
2015/04/07 PHP
php结合正则获取字符串中数字
2015/06/19 PHP
Prototype使用指南之selector.js说明
2008/10/26 Javascript
js时间日期和毫秒的相互转换
2013/02/22 Javascript
JS的document.all函数使用示例
2013/12/30 Javascript
javascript检测浏览器的缩放状态实现代码
2014/09/28 Javascript
jQuery validate插件submitHandler提交导致死循环解决方法
2016/01/21 Javascript
Bootstrap入门书籍之(四)菜单、按钮及导航
2016/02/17 Javascript
AngularJS 依赖注入详解和简单实例
2016/07/28 Javascript
Vue 短信验证码组件开发详解
2017/02/14 Javascript
js调用刷新界面的几种方式
2017/05/03 Javascript
用React-Native+Mobx做一个迷你水果商城APP(附源码)
2017/12/25 Javascript
JavaScript学习笔记之数组基本操作示例
2019/01/09 Javascript
javascript判断一个变量是数组还是对象
2019/04/10 Javascript
通过实践编写优雅的JavaScript代码
2019/05/30 Javascript
基于layui的下拉列表的数据回显方法
2019/09/24 Javascript
微信小程序webSocket的使用方法
2020/02/20 Javascript
Vue使用Three.js加载glTF模型的方法详解
2020/06/14 Javascript
下载给定网页上图片的方法
2014/02/18 Python
9种python web 程序的部署方式小结
2014/06/30 Python
python安装virtualenv虚拟环境步骤图文详解
2019/09/18 Python
基于Python获取docx/doc文件内容代码解析
2020/02/17 Python
Python matplotlib图例放在外侧保存时显示不完整问题解决
2020/07/28 Python
python软件测试Jmeter性能测试JDBC Request(结合数据库)的使用详解
2021/01/26 Python
HTML5拖拽功能实现的拼图游戏
2018/07/31 HTML / CSS
详解HTML5中CSS外观属性
2020/09/10 HTML / CSS
CK美国官网:Calvin Klein
2016/08/26 全球购物
英国门把手公司:Door Handle Company
2019/05/12 全球购物
印尼在线旅游门户网站:NusaTrip
2019/11/01 全球购物
如何在Oracle中查看各个表、表空间占用空间的大小
2015/10/31 面试题
社区维稳工作方案
2014/06/06 职场文书
2014副镇长民主生活会个人对照检查材料思想汇报
2014/09/30 职场文书
四风查摆问题及整改措施
2014/10/10 职场文书
金正昆讲礼仪观后感
2015/06/11 职场文书
2019年个人工作总结范文
2019/03/25 职场文书
Nginx 路由转发和反向代理location配置实现
2021/11/11 Servers