一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法。

而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用。

这有利于组织代码,把某些应该属于某个类的函数给放到那个类里去,同时有利于命名空间的整洁。

既然@staticmethod和@classmethod都可以直接类名.方法名()来调用,那他们有什么区别呢

从它们的使用上来看,

  • @staticmethod不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样。
  • @classmethod也不需要self参数,但第一个参数需要是表示自身类的cls参数。

如果在@staticmethod中要调用到这个类的一些属性方法,只能直接类名.属性名或类名.方法名。

而@classmethod因为持有cls参数,可以来调用类的属性,类的方法,实例化对象等,避免硬编码。

下面上代码。

  1. class A(object):
  2. bar = 1
  3. def foo(self):
  4. print('foo')
  5. @staticmethod
  6. def static_foo():
  7. print('static_foo')
  8. print(A.bar)
  9. @classmethod
  10. def class_foo(cls):
  11. print('class_foo')
  12. print(cls.bar)
  13. cls().foo()
  14. A.static_foo()
  15. A.class_foo()

输出
static_foo
1
class_foo
1
foo

最新文章

  1. PE文件学习系列笔记四-C++实现PE文件的分析
  2. Replication--复制延迟的诊断和解决
  3. RTP、RTCP
  4. 表连接到底咋回事,就是产生中间结果啊!用于给select/insert等操作用
  5. 一个通用的Makefile (转)
  6. NGINX server配置中if的用法
  7. Java_JVM学习笔记(深入理解Java虚拟机)___重点
  8. 【HDOJ】1601 Galactic Import
  9. Visual Studio 2017 离线安装方式
  10. Linux双网卡绑定实现负载均衡
  11. 在VS2017中安装OpenGL
  12. python3控制语句---选择结构语句
  13. json模块 & pickle模块
  14. Jmeter原理
  15. 20145225唐振远《网络对抗》 Web安全基础实践
  16. windows平台下spark-shell配置
  17. Spring框架中,在工具类或者普通Java类中调用service或dao
  18. 进入保护模式(二)——《x86汇编语言:从实模式到保护模式》读书笔记14
  19. C#string byte[] base64位互相转换
  20. c++ 重载运算与类型转换

热门文章

  1. 详解CorelDRAW中关于群组的操作
  2. Java时间日期字符串格式转换大全
  3. 【D】分布式系统的CAP理论
  4. Hibernate_day03讲义_使用Hibernate完成多对多的关系映射并操作
  5. Floyd 和 bellman 算法
  6. lua 根据函数名字符串来执行函数
  7. 【代码审计】QYKCMS_v4.3.2 任意文件读取漏洞分析
  8. [转]linux下释放文件内存
  9. NFS exportfs 命令
  10. 【译】Kafka学习之路