基于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继承和抽象类的实现方法
Jan 14 Python
用Python编写分析Python程序性能的工具的教程
Apr 01 Python
Python脚本获取操作系统版本信息
Dec 17 Python
TensorFlow安装及jupyter notebook配置方法
Sep 08 Python
Python搜索引擎实现原理和方法
Nov 27 Python
Python文本统计功能之西游记用字统计操作示例
May 07 Python
利用Python将文本中的中英文分离方法
Oct 31 Python
python单例模式的多种实现方法
Jul 26 Python
Python协程 yield与协程greenlet简单用法示例
Nov 22 Python
Python 项目转化为so文件实例
Dec 23 Python
python logging模块的使用
Sep 07 Python
Opencv常见图像格式Data Type及代码实例
Nov 02 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
re0第二季蕾姆被制作组打入冷宫!艾米莉亚女主扶正,原因唏嘘
2020/04/02 日漫
用PHP读注册表
2006/10/09 PHP
php 数组排序 array_multisort与uasort的区别
2011/03/24 PHP
PHP 透明水印生成代码
2012/08/27 PHP
destoon二次开发模板及调用语法汇总
2014/06/21 PHP
PHP strtotime函数用法、实现原理和源码分析
2015/02/04 PHP
在php7中MongoDB实现模糊查询的方法详解
2017/05/03 PHP
vmware linux系统安装最新的php7图解
2019/04/14 PHP
Laravel手动返回错误码示例
2019/10/22 PHP
php正则表达式使用方法整理集合
2020/01/31 PHP
jquery 必填项判断表单是否为空的方法
2008/09/14 Javascript
jQuery学习笔记(4)--Jquery中获取table中某列值的具体思路
2013/04/10 Javascript
js克隆对象、数组的常用方法介绍
2013/09/26 Javascript
js生成动态表格并为每个单元格添加单击事件的方法
2014/04/14 Javascript
js动态删除div元素基本思路及实现代码
2014/05/08 Javascript
JS使用for循环遍历Table的所有单元格内容
2014/08/21 Javascript
jQuery实现的经典竖向伸缩菜单效果代码
2015/09/24 Javascript
jQuery DataTables插件自定义Ajax分页实例解析
2020/04/28 Javascript
Angularjs使用directive自定义指令实现attribute继承的方法详解
2016/08/05 Javascript
详解AngularJs路由之Ui-router-resolve(预加载)
2017/06/13 Javascript
vue事件修饰符和按键修饰符用法总结
2017/07/25 Javascript
jQuery读取本地的json文件(实例讲解)
2017/10/31 jQuery
vue elementui form表单验证的实现
2018/11/11 Javascript
python实现识别手写数字 python图像识别算法
2020/03/23 Python
python Django里CSRF 对应策略详解
2019/08/05 Python
在python中创建指定大小的多维数组方式
2019/11/28 Python
django前端页面下拉选择框默认值设置方式
2020/08/09 Python
香港彩色隐形眼镜在线商店:Stunninglens(全球免费送货)
2019/05/10 全球购物
给学校的建议书
2014/03/12 职场文书
补充协议书范本
2014/04/23 职场文书
火灾现场处置方案
2014/05/28 职场文书
违章停车检讨书
2014/10/21 职场文书
2015年幼儿园学期工作总结
2015/05/22 职场文书
丧事酒宴答谢词
2015/09/30 职场文书
技术入股协议书
2016/03/22 职场文书
导游词之无锡梅园
2019/11/28 职场文书