基于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实现批量重命名文件的代码
May 25 Python
Python功能键的读取方法
May 28 Python
在Django的form中使用CSS进行设计的方法
Jul 18 Python
基于Django contrib Comments 评论模块(详解)
Dec 08 Python
用python脚本24小时刷浏览器的访问量方法
Dec 07 Python
python实现转圈打印矩阵
Mar 02 Python
python set集合使用方法解析
Nov 05 Python
如何使用Python多线程测试并发漏洞
Dec 18 Python
Python3列表List入门知识附实例
Feb 09 Python
python em算法的实现
Oct 03 Python
python中xlutils库用法浅析
Dec 29 Python
Python中Matplotlib的点、线形状、颜色以及绘制散点图
Apr 07 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 设计模式之 单例模式
2008/12/19 PHP
php邮件发送,php发送邮件的类
2011/03/24 PHP
将php数组输出html表格的方法
2014/02/24 PHP
php将html转成wml的WAP标记语言实例
2015/07/08 PHP
php中的异常和错误浅析
2017/05/03 PHP
Laravel解决nesting level错误和隐藏index.php的问题
2019/10/12 PHP
经典海量jQuery插件 大家可以收藏一下
2010/02/07 Javascript
getElementsByTagName vs selectNodes效率 及兼容的selectNodes实现
2010/02/26 Javascript
JavaScript中函数声明优先于变量声明的实例分析
2012/03/01 Javascript
浅谈 jQuery 事件源码定位问题
2014/06/18 Javascript
深入分析escape()、encodeURI()、encodeURIComponent()的区别及示例
2014/08/04 Javascript
jQuery中:lt选择器用法实例
2014/12/29 Javascript
jQuery实现控制文字内容溢出用省略号(…)表示的方法
2016/02/26 Javascript
javascript RegExp 使用说明
2016/05/21 Javascript
Vue.js 2.5新特性介绍(推荐)
2017/10/24 Javascript
浅谈vue项目打包优化策略
2018/09/29 Javascript
React Hooks的深入理解与使用
2018/11/12 Javascript
vue.js购物车添加商品组件的方法
2019/09/17 Javascript
axios封装与传参示例详解
2020/10/18 Javascript
Python中使用Boolean操作符做真值测试实例
2015/01/30 Python
对Python 窗体(tkinter)树状数据(Treeview)详解
2018/10/11 Python
使用PYTHON解析Wireshark的PCAP文件方法
2019/07/23 Python
django 通过URL访问上传的文件方法
2019/07/28 Python
浅析PyTorch中nn.Linear的使用
2019/08/18 Python
python应用Axes3D绘图(批量梯度下降算法)
2020/03/25 Python
浅谈anaconda python 版本对应关系
2020/10/07 Python
美国保健品专家:Life Extension
2018/05/04 全球购物
彪马土耳其官网:PUMA土耳其
2019/07/14 全球购物
泰国排名第一的家居用品中心:HomePro
2020/11/18 全球购物
Johnson Fitness澳大利亚:高级健身器材
2021/03/16 全球购物
如何用JQuery进行表单验证
2013/05/29 面试题
购房协议书
2014/04/11 职场文书
促销活动总结怎么写
2014/06/25 职场文书
领导班子群众路线与四风问题对照检查材料思想汇报
2014/10/11 职场文书
总经理年会致辞
2015/07/29 职场文书
公司转让协议书
2016/03/19 职场文书