基于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判断值是否在list或set中的性能对比分析
Apr 16 Python
Python网络爬虫实例讲解
Apr 28 Python
使用Anaconda3建立虚拟独立的python2.7环境方法
Jun 11 Python
Python如何实现强制数据类型转换
Nov 22 Python
python-视频分帧&amp;多帧合成视频实例
Dec 10 Python
Python常用模块sys,os,time,random功能与用法实例分析
Jan 07 Python
使用Python将图片转正方形的两种方法实例代码详解
Apr 29 Python
Python基于BeautifulSoup爬取京东商品信息
Jun 01 Python
Python matplotlib图例放在外侧保存时显示不完整问题解决
Jul 28 Python
4款Python 类型检查工具,你选择哪个呢?
Oct 30 Python
python 6种方法实现单例模式
Dec 15 Python
总结Python使用过程中的bug
Jun 18 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处理图片变得简单 基于gb库的图片处理类附实例代码下载
2011/05/17 PHP
PHP+jQuery 注册模块的改进(三):更新到Smarty3.1
2014/10/14 PHP
php实现通过cookie换肤的方法
2015/07/13 PHP
PHP函数checkdnsrr用法详解(Windows平台用法)
2016/03/21 PHP
PHP实现的二分查找算法实例分析
2017/12/19 PHP
15 个 JavaScript Web UI 库
2010/05/19 Javascript
基于jQuery捕获超链接事件进行局部刷新代码
2012/05/10 Javascript
jquery获得option的值和对option进行操作
2013/12/13 Javascript
javascript函数作用域学习示例(js作用域)
2014/01/13 Javascript
JavaScript自定义日期格式化函数详细解析
2014/01/14 Javascript
js sort 二维数组排序的用法小结
2014/01/24 Javascript
关于验证码在IE中不刷新的快速解决方法
2016/09/23 Javascript
jQuery checkbox选中问题之prop与attr注意点分析
2016/11/15 Javascript
jQuery实现拖动剪裁图片作为头像
2016/12/28 Javascript
jQuery实现贪吃蛇小游戏(附源码下载)
2017/03/04 Javascript
vue全局组件与局部组件使用方法详解
2018/03/29 Javascript
vue 权限认证token的实现方法
2018/07/17 Javascript
Vue.js 使用v-cloak后仍显示变量的解决方法
2018/11/19 Javascript
详解Vue iview IE浏览器不兼容报错(Iview Bable polyfill)
2019/01/07 Javascript
详解Vue调用手机相机和相册以及上传
2019/05/05 Javascript
解决Layui数据表格的宽高问题
2019/09/28 Javascript
使用next.js开发网址缩短服务的方法
2020/06/17 Javascript
mapboxgl区划标签避让不遮盖实现的代码详解
2020/07/01 Javascript
Postman无法正常返回结果问题解决
2020/08/28 Javascript
python实现感知器算法详解
2017/12/19 Python
Python中join()函数多种操作代码实例
2020/01/13 Python
python实现三壶谜题的示例详解
2020/11/02 Python
购买美国制造的相框和画框架:Picture Frames
2018/08/14 全球购物
2014年幼儿园植树节活动方案
2014/03/02 职场文书
学生个人自我鉴定范文
2014/03/28 职场文书
应届生自荐信
2014/06/30 职场文书
机关作风建设剖析材料
2014/10/11 职场文书
2014年物业管理工作总结
2014/11/21 职场文书
实习指导教师评语
2014/12/30 职场文书
Pytorch 如何加速Dataloader提升数据读取速度
2021/05/28 Python
《进击的巨人》新联动CM 兵长强势出击兽巨人
2022/04/05 日漫