基于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处理cookie详解
Feb 07 Python
Python文件右键找不到IDLE打开项解决办法
Jun 08 Python
Python实现调度算法代码详解
Dec 01 Python
分析python请求数据
Aug 19 Python
Python类的继承用法示例
Jan 31 Python
使用Python快速制作可视化报表的方法
Feb 03 Python
python实现在函数图像上添加文字和标注的方法
Jul 08 Python
python读取大文件越来越慢的原因与解决
Aug 08 Python
django-rest-swagger的优化使用方法
Aug 29 Python
Pycharm 安装 idea VIM插件的图文教程详解
Feb 21 Python
jupyter note 实现将数据保存为word
Apr 14 Python
用python读取xlsx文件
Dec 17 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中使用parse_url()对网址进行解析的实现代码(parse_url详解)
2012/01/03 PHP
php分页代码学习示例分享
2014/02/20 PHP
详解php命令注入攻击
2019/04/06 PHP
再谈IE中Flash控件的自动激活 ObjectWrap
2007/03/09 Javascript
node.js不得不说的12点内容
2014/07/14 Javascript
js实现遮罩层弹出框的方法
2015/01/15 Javascript
javascript实现动态导入js与css等静态资源文件的方法
2015/07/25 Javascript
基于jquery实现可定制的web在线富文本编辑器附源码下载
2015/11/17 Javascript
javascript基础语法——全面理解变量和标识符
2016/06/02 Javascript
巧方法 JavaScript获取超链接的绝对URL地址
2016/06/14 Javascript
Angularjs实现带查找筛选功能的select下拉框示例代码
2016/10/04 Javascript
JavaScript 字符串数字左补位,右补位,取固定长度,截位扩展函数代码
2017/03/25 Javascript
Node.js中使用mongoose操作mongodb数据库的方法
2017/09/12 Javascript
解决使用Vue.js显示数据的时,页面闪现原始代码的问题
2018/02/11 Javascript
elementui的默认样式修改方法
2018/02/23 Javascript
解决vue点击控制单个样式的问题
2018/09/05 Javascript
jQuery实现根据身份证号获取生日、年龄、性别等信息的方法
2019/01/09 jQuery
刷新页面后让控制台的js代码继续执行
2019/09/20 Javascript
vue中使用腾讯云Im的示例
2020/10/23 Javascript
[01:01]青春无憾,一战成名——DOTA2全国高校联赛开启
2018/02/25 DOTA
[49:27]LGD vs OG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python实现将数据框数据写入mongodb及mysql数据库的方法
2018/04/02 Python
Python安装lz4-0.10.1遇到的坑
2018/05/20 Python
Python分割指定页数的pdf文件方法
2018/10/26 Python
浅谈Python的list中的选取范围
2018/11/12 Python
我就是这样学习Python中的列表
2019/06/02 Python
pytorch中交叉熵损失(nn.CrossEntropyLoss())的计算过程详解
2020/01/02 Python
时装界的“朋克之母”:Vivienne Westwood
2017/07/06 全球购物
Marc O’Polo俄罗斯官方在线商店:德国高端时尚品牌
2019/12/26 全球购物
餐饮主管岗位职责
2013/12/10 职场文书
师范学院毕业生求职信
2014/06/24 职场文书
毕业证明模板
2015/06/19 职场文书
校园新闻稿范文
2015/07/18 职场文书
Python实现8种常用抽样方法
2021/06/27 Python
Python中的turtle画箭头,矩形,五角星
2022/03/16 Python
vue 实现弹窗关闭后刷新效果
2022/04/08 Vue.js