基于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 05 Python
微信跳一跳python辅助脚本(总结)
Jan 11 Python
Python机器学习logistic回归代码解析
Jan 17 Python
Python和Go语言的区别总结
Feb 20 Python
Django中使用Whoosh进行全文检索的方法
Mar 31 Python
Python爬取数据保存为Json格式的代码示例
Apr 09 Python
tensorflow2.0与tensorflow1.0的性能区别介绍
Feb 07 Python
在keras里面实现计算f1-score的代码
Jun 15 Python
Python+pyftpdlib实现局域网文件互传
Aug 24 Python
python 简单的调用有道翻译
Nov 25 Python
python 如何读、写、解析CSV文件
Mar 03 Python
Python Matplotlib库实现画局部图
Nov 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
搜索引擎技术核心揭密
2006/10/09 PHP
如何实现给定日期的若干天以后的日期
2006/10/09 PHP
php fckeditor 调用的函数
2009/06/21 PHP
php实现简单爬虫的开发
2016/03/28 PHP
PHP简单实现无限级分类的方法
2016/05/13 PHP
CI框架教程之优化验证码机制详解【验证码辅助函数】
2019/04/16 PHP
页面只有一个text的时候,回车自动submit的解决方法
2010/08/12 Javascript
extjs两个tbar问题探讨
2013/08/08 Javascript
Chrome下ifame父窗口调用子窗口的问题示例探讨
2014/03/17 Javascript
基于jquery的手风琴图片展示效果实现方法
2014/12/16 Javascript
JS+CSS实现淡入式焦点图片幻灯切换效果的方法
2015/02/26 Javascript
jQuery联动日历的实例解析
2016/12/02 Javascript
解析JavaScript数组方法reduce
2016/12/12 Javascript
JS实现页面打印功能
2017/03/16 Javascript
JavaScript中在光标处插入添加文本标签节点的详细方法
2017/03/22 Javascript
ES6新特性之模块Module用法详解
2017/04/01 Javascript
基于jQuery使用Ajax动态执行模糊查询功能
2018/07/05 jQuery
微信小程序中使用wxss加载图片并实现动画效果
2018/08/13 Javascript
JavaScript使用类似break机制中断forEach循环的方法
2018/11/13 Javascript
[59:30]VG vs LGD 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.22
2019/09/05 DOTA
从零学Python之入门(二)基本数据类型
2014/05/25 Python
剖析Django中模版标签的解析与参数传递
2015/07/21 Python
点球小游戏python脚本
2018/05/22 Python
对Python闭包与延迟绑定的方法详解
2019/01/07 Python
完美解决pyinstaller打包报错找不到依赖pypiwin32或pywin32-ctypes的错误
2020/04/01 Python
Python全局变量与global关键字常见错误解决方案
2020/10/05 Python
python3爬虫中引用Queue的实例讲解
2020/11/24 Python
利用python为PostgreSQL的表自动添加分区
2021/01/18 Python
优秀学生干部个人的自我评价
2013/10/04 职场文书
王老吉广告词
2014/03/20 职场文书
党的群众路线学习材料
2014/05/16 职场文书
机械加工与数控专业自荐书
2014/06/04 职场文书
公司离职证明范本(5篇)
2014/09/17 职场文书
教师外出学习心得体会
2016/01/18 职场文书
2019通用版导游词范本!
2019/08/07 职场文书
python 如何用terminal输入参数
2021/05/25 Python