基于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将MongoDB里的ObjectId转换为时间戳的方法
Mar 13 Python
python学习必备知识汇总
Sep 08 Python
python实现判断一个字符串是否是合法IP地址的示例
Jun 04 Python
对django后台admin下拉框进行过滤的实例
Jul 26 Python
face++与python实现人脸识别签到(考勤)功能
Aug 28 Python
Python Django 前后端分离 API的方法
Aug 28 Python
Django配置MySQL数据库的完整步骤
Sep 07 Python
python+OpenCV实现车牌号码识别
Nov 08 Python
Django自定义用户表+自定义admin后台中的字段实例
Nov 18 Python
Python实现疫情通定时自动填写功能(附代码)
May 27 Python
python实现批量移动文件
Apr 05 Python
Python matplotlib绘制条形统计图 处理多个实验多组观测值
Apr 21 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
javascript面向对象的方式实现的弹出层效果代码
2010/01/28 Javascript
js获取当前select 元素值的代码
2010/04/19 Javascript
详解JavaScript中的表单验证
2015/06/16 Javascript
JavaScript事件类型中UI事件详解
2016/01/14 Javascript
深入理解JavaScript内置函数
2016/06/03 Javascript
微信小程序 弹幕功能简单实例
2017/02/14 Javascript
使用openSpeDiv方法实现Ecshop登录弹窗框效果
2017/03/13 Javascript
20行js代码实现的贪吃蛇小游戏
2017/06/20 Javascript
jQuery实现的回车触发按钮事件功能示例
2018/03/25 jQuery
详解使用uni-app开发微信小程序之登录模块
2019/05/09 Javascript
利用原生JS实现欢乐水果机小游戏
2020/04/23 Javascript
使用Django启动命令行及执行脚本的方法
2018/05/29 Python
python批量导入数据进Elasticsearch的实例
2018/05/30 Python
python树的同构学习笔记
2019/09/14 Python
在pandas中遍历DataFrame行的实现方法
2019/10/23 Python
基于Tensorflow:CPU性能分析
2020/02/10 Python
Django-migrate报错问题解决方案
2020/04/21 Python
Python基于pandas爬取网页表格数据
2020/05/11 Python
django自带的权限管理Permission用法说明
2020/05/13 Python
django orm模块中的 is_delete用法
2020/05/20 Python
keras和tensorflow使用fit_generator 批次训练操作
2020/07/03 Python
html5实现移动端适配完美写法
2017/11/16 HTML / CSS
Pretty Little Thing美国:时尚女性服饰
2018/08/27 全球购物
ESDlife健康生活易:身体检查预订、搜寻及比较
2019/05/10 全球购物
Furla官网:意大利著名的皮革品牌
2019/08/06 全球购物
小区门卫值班制度
2014/01/24 职场文书
初中生自我评价
2014/02/01 职场文书
动画设计系毕业生求职信
2014/07/15 职场文书
个人存款证明书
2014/10/18 职场文书
2015元旦主持词开场白和结束语
2014/12/14 职场文书
党员先进事迹材料
2014/12/19 职场文书
2015年纪检监察工作总结
2015/04/08 职场文书
质检员工作总结2015
2015/04/25 职场文书
简短的36句中秋节祝福信息语句
2019/09/09 职场文书
spring cloud 配置中心客户端启动遇到的问题
2021/09/25 Java/Android
SONY600GR,国产收音机厂商永远的痛
2022/04/05 无线电