基于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搜索指定目录的方法
Apr 29 Python
python基于socket实现网络广播的方法
Apr 29 Python
Python列表生成式与生成器操作示例
Aug 01 Python
Django分页查询并返回jsons数据(中文乱码解决方法)
Aug 02 Python
python实现飞机大战微信小游戏
Mar 21 Python
3分钟学会一个Python小技巧
Nov 23 Python
Python实现批量修改图片格式和大小的方法【opencv库与PIL库】
Dec 03 Python
Django实现一对多表模型的跨表查询方法
Dec 18 Python
详解python3安装pillow后报错没有pillow模块以及没有PIL模块问题解决
Apr 17 Python
Python帮你微信头像任意添加装饰别再@微信官方了
Sep 25 Python
Python 解析简单的XML数据
Jul 24 Python
Python经常使用的一些内置函数
Apr 11 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
file_get_contents(&quot;php://input&quot;, &quot;r&quot;)实例介绍
2013/07/01 PHP
javascript 遍历验证所有文本框的值
2009/08/27 Javascript
jQuery制作拼图小游戏
2015/01/12 Javascript
JavaScript中使用concat()方法拼接字符串的教程
2015/06/06 Javascript
详解JavaScript实现设计模式中的适配器模式的方法
2016/05/18 Javascript
在JavaScript中调用Java类和接口的方法
2016/09/07 Javascript
js基础之DOM中元素对象的属性方法详解
2016/10/28 Javascript
javascript实现简单的可随机变色网页计算器示例
2016/12/30 Javascript
JS正则匹配中文的方法示例
2017/01/06 Javascript
node.js 中间件express-session使用详解
2017/05/20 Javascript
React Native 环境搭建的教程
2017/08/19 Javascript
canvas绘制爱心的几种方法总结(推荐)
2017/10/31 Javascript
使用veloticy-ui生成文字动画效果
2018/02/08 Javascript
解决使用Vue.js显示数据的时,页面闪现原始代码的问题
2018/02/11 Javascript
jQuery实现下拉菜单动态添加数据点击滑出收起其他功能
2018/06/14 jQuery
Javascript中弹窗confirm与prompt的区别
2018/10/26 Javascript
vue-router传参用法详解
2019/01/19 Javascript
vue2.0 如何在hash模式下实现微信分享
2019/01/22 Javascript
Vue动态组件与异步组件实例详解
2019/02/23 Javascript
Vue Cli 3项目使用融云IM实现聊天功能的方法
2019/04/19 Javascript
详解JS实现简单的时分秒倒计时代码
2019/04/25 Javascript
vue实现动态按钮功能
2019/05/13 Javascript
详解Vuex下Store的模块化拆分实践
2019/07/31 Javascript
python Matplotlib画图之调整字体大小的示例
2017/11/20 Python
python中map的基本用法示例
2018/09/10 Python
python实现栅栏加解密 支持密钥加密
2019/03/20 Python
Python关于反射的实例代码分享
2020/02/20 Python
Python3.7 读取音频根据文件名生成脚本的代码
2020/04/07 Python
Flask中sqlalchemy模块的实例用法
2020/08/02 Python
Python3利用scapy局域网实现自动多线程arp扫描功能
2021/01/21 Python
幼儿园标语大全
2014/06/19 职场文书
售后前台接待岗位职责
2015/04/03 职场文书
2015年世界急救日宣传活动方案
2015/05/06 职场文书
欢送会主持词
2015/07/01 职场文书
文明医院的标语集锦!
2019/07/24 职场文书
Golang 编译成DLL文件的操作
2021/05/06 Golang