基于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实现TCP服务器端与客户端的方法详解
Apr 30 Python
python实现在sqlite动态创建表的方法
May 08 Python
PyTorch 1.0 正式版已经发布了
Dec 13 Python
python实现年会抽奖程序
Jan 22 Python
django项目登录中使用图片验证码的实现方法
Aug 15 Python
Python3 合并二叉树的实现
Sep 30 Python
python实现银行管理系统
Oct 25 Python
python修改文件内容的3种方法详解
Nov 15 Python
Django数据库操作之save与update的使用
Apr 01 Python
Python自动化之UnitTest框架实战记录
Sep 08 Python
PyCharm Ctrl+Shift+F 失灵的简单有效解决操作
Jan 15 Python
python 如何获取页面所有a标签下href的值
May 06 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
学习YUI.Ext基础第一天
2007/03/10 Javascript
一个收集图片的bookmarlet(js 刷新页面中的图片)
2010/05/27 Javascript
jquery插件之easing使用
2010/08/19 Javascript
js转化毫秒为时间格式代码
2014/04/10 Javascript
使用documentElement正确取得当前可见区域的大小
2014/07/25 Javascript
JS实现的页面自定义滚动条效果
2015/10/26 Javascript
JavaScript截取、切割字符串的技巧
2016/01/07 Javascript
微信小程序 配置文件详细介绍
2016/12/14 Javascript
JS实现本地存储信息的方法(基于localStorage与userData)
2017/02/18 Javascript
JavaScript实现简单的双色球(实例讲解)
2017/07/31 Javascript
Angular4.x Event (DOM事件和自定义事件详解)
2018/10/09 Javascript
Vue+iview+webpack ie浏览器兼容简单处理
2019/09/20 Javascript
vue子组件改变父组件传递的prop值通过sync实现数据双向绑定(DEMO)
2020/02/01 Javascript
Angular+Ionic使用queryParams实现跳转页传值的方法
2020/09/05 Javascript
构建一个JavaScript插件系统
2020/10/20 Javascript
微信小程序实现文件预览
2020/10/22 Javascript
python3.5使用tkinter制作记事本
2016/06/20 Python
Python常用的内置序列结构(列表、元组、字典)学习笔记
2016/07/08 Python
Python实现的NN神经网络算法完整示例
2018/06/19 Python
使用python验证代理ip是否可用的实现方法
2018/07/25 Python
使用11行Python代码盗取了室友的U盘内容
2018/10/23 Python
python分别打包出32位和64位应用程序
2020/02/18 Python
Python小白垃圾回收机制入门
2020/06/09 Python
Python tkinter实现日期选择器
2021/02/22 Python
css3 column实现卡片瀑布流布局的示例代码
2018/06/22 HTML / CSS
财经学院自荐信范文
2014/02/02 职场文书
《和田的维吾尔》教学反思
2014/04/14 职场文书
心理健康活动总结
2014/04/30 职场文书
室内设计专业自荐信
2014/05/31 职场文书
传播学专业毕业生自荐书
2014/07/01 职场文书
餐饮食品安全责任书
2015/01/29 职场文书
2015年英语教研组工作总结
2015/05/23 职场文书
六一儿童节主持开场白
2015/05/28 职场文书
解析MySQL binlog
2021/06/11 MySQL
Pygame Event事件模块的详细示例
2021/11/17 Python
MySQL查询日期时间
2022/05/15 MySQL