基于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多线程ctrl+c退出问题解决方案
Oct 23 Python
Python编程之event对象的用法实例分析
Mar 23 Python
python中使用正则表达式的后向搜索肯定模式(推荐)
Nov 11 Python
Python模块的加载讲解
Jan 15 Python
Python识别快递条形码及Tesseract-OCR使用详解
Jul 15 Python
使用python写一个自动浏览文章的脚本实例
Dec 05 Python
python中有关时间日期格式转换问题
Dec 25 Python
python修改linux中文件(文件夹)的权限属性操作
Mar 05 Python
python实现提取COCO,VOC数据集中特定的类
Mar 10 Python
python 使用cycle构造无限循环迭代器
Dec 02 Python
浅谈Selenium 控制浏览器的常用方法
Dec 04 Python
python 爬虫请求模块requests详解
Dec 04 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读注册表
2006/10/09 PHP
PHP取整数函数常用的四种方法小结
2012/07/05 PHP
PHP实现的网站目录扫描索引工具
2016/09/08 PHP
Laravel中Facade的加载过程与原理详解
2017/09/22 PHP
详解PHP文件的自动加载(autoloading)
2018/02/04 PHP
Javascript 面向对象(二)封装代码
2012/05/23 Javascript
jquery submit ie6下失效的原因分析及解决方法
2013/11/15 Javascript
js中匿名函数的创建与调用方法分析
2014/12/19 Javascript
jQuery+CSS3折叠卡片式下拉列表框实现效果
2015/11/02 Javascript
详解微信小程序开发之城市选择器 城市切换
2017/01/17 Javascript
Vue调试神器vue-devtools安装方法
2017/12/12 Javascript
使用validate.js实现表单数据提交前的验证方法
2018/09/04 Javascript
React Native中Mobx的使用方法详解
2018/12/04 Javascript
解决微信浏览器缓存站点入口文件(IIS部署Vue项目)
2019/06/17 Javascript
layui table复选框禁止某几条勾选的实例
2019/09/20 Javascript
Ant Design Pro 之 ProTable使用操作
2020/10/31 Javascript
跟老齐学Python之玩转字符串(3)
2014/09/14 Python
浅谈Python中copy()方法的使用
2015/05/21 Python
tensorflow实现简单的卷积网络
2018/05/24 Python
python之线程通过信号pyqtSignal刷新ui的方法
2019/01/11 Python
Python+OpenCV采集本地摄像头的视频
2019/04/25 Python
在pyqt5中QLineEdit里面的内容回车发送的实例
2019/06/21 Python
Python3.7 基于 pycryptodome 的AES加密解密、RSA加密解密、加签验签
2019/12/04 Python
python中for in的用法详解
2020/04/17 Python
Pycharm的Available Packages为空的解决方法
2020/09/18 Python
基于ccs3的timeline时间线实现方法
2020/04/30 HTML / CSS
美国美妆网站:B-Glowing
2016/10/12 全球购物
FC-Moto美国:欧洲最大的摩托车服装和头盔商店之一
2019/08/24 全球购物
幼儿园实习自我鉴定
2013/12/15 职场文书
管道维修工岗位职责
2013/12/27 职场文书
美术毕业生求职信
2014/02/25 职场文书
促销活动总结报告
2014/04/26 职场文书
本科毕业生求职信
2014/06/15 职场文书
个人查摆问题自查报告
2014/10/16 职场文书
2016年11月份红领巾广播稿
2015/12/21 职场文书
如何在pycharm中快捷安装pip命令(如pygame)
2021/05/31 Python