基于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传递中文参数的问题
Aug 04 Python
git进行版本控制心得详谈
Dec 10 Python
python列表list保留顺序去重的实例
Dec 14 Python
python3实现点餐系统
Jan 24 Python
如何利用Anaconda配置简单的Python环境
Jun 24 Python
Pandas_cum累积计算和rolling滚动计算的用法详解
Jul 04 Python
python将print输出的信息保留到日志文件中
Sep 27 Python
给 TensorFlow 变量进行赋值的方式
Feb 10 Python
Python request使用方法及问题总结
Apr 26 Python
Python带参数的装饰器运行原理解析
Jun 09 Python
深入了解Python装饰器的高级用法
Aug 13 Python
PyCharm常用配置和常用插件(小结)
Feb 06 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 数组动态添加实现代码(最土团购系统的价格排序)
2011/12/30 PHP
php使用lua+redis实现限流,计数器模式,令牌桶模式
2019/04/04 PHP
JS 中document.URL 和 windows.location.href 的区别
2009/11/11 Javascript
JavaScript图像延迟加载库Echo.js
2016/04/05 Javascript
javascript实现列表切换效果
2016/05/02 Javascript
jquery轮播的实现方式 附完整实例
2016/07/28 Javascript
js获取Get值的方法
2016/09/29 Javascript
详解NodeJs支付宝移动支付签名及验签
2017/01/06 NodeJs
touch.js 拖动、缩放、旋转 (鼠标手势)功能代码
2017/02/04 Javascript
nodejs个人博客开发第五步 分配数据
2017/04/12 NodeJs
JS简单获取当前日期和农历日期的方法
2017/04/17 Javascript
基于JS对象创建常用方式及原理分析
2017/06/28 Javascript
js实现水平滚动菜单导航
2017/07/21 Javascript
JS解惑之Object中的key是有序的么
2019/05/06 Javascript
Vue.js实现大转盘抽奖总结及实现思路
2019/10/09 Javascript
nodejs对mongodb数据库的增加修删该查实例代码
2020/01/05 NodeJs
vue中解决拖拽改变存在iframe的div大小时卡顿问题
2020/07/22 Javascript
JavaScript this关键字的深入详解
2021/01/14 Javascript
python实现多线程暴力破解登陆路由器功能代码分享
2015/01/04 Python
Python 使用os.remove删除文件夹时报错的解决方法
2017/01/13 Python
python爬虫基本知识
2018/03/05 Python
python 地图经纬度转换、纠偏的实例代码
2018/08/06 Python
对web.py设置favicon.ico的方法详解
2018/12/04 Python
解决pyttsx3无法封装的问题
2018/12/24 Python
Django上使用数据可视化利器Bokeh解析
2019/07/31 Python
python实现图片压缩代码实例
2019/08/12 Python
Django1.11自带分页器paginator的使用方法
2019/10/31 Python
美国最大的在线寄售和旧货店:Swap.com
2018/08/27 全球购物
文明家庭先进事迹材
2014/01/27 职场文书
请假条怎么写
2014/04/10 职场文书
大学新闻系自荐书
2014/05/31 职场文书
现场活动策划方案
2014/08/22 职场文书
2015年党员个人自我评价
2015/03/03 职场文书
2015年度服装销售工作总结
2015/03/31 职场文书
2015年学校安全管理工作总结
2015/05/11 职场文书
详解CSS3浏览器兼容
2022/12/24 HTML / CSS