classmethod和staticmethod的区别
今天读代码的时候发现Python的class定义中提及了@classmethod修饰符,然后查阅了一些材料一探究竟,先做个总结吧。
在Python中提到 classmethod 就要提到 staticmethod,不是因为二者有什么关系,而是为了让用户区分以便更清楚地写代码。在C++中,我们了解直接通过类名访问的函数称为类的静态函数,即static修饰的函数,可见C++中classmethod和staticmethod是一个概念。
那么python中二者有什么区别呢?先来看下二者如何在python代码中声明:
class MyClass:
…
@classmethod # classmethod的修饰符
def class_method(cls, arg1, arg2, …):
…
@staticmethod # staticmethod的修饰符
def static_method(arg1, arg2, …):
…
对于classmethod的参数,需要隐式地传递类名,而staticmethod参数中则不需要传递类名,其实这就是二者最大的区别。
二者都可以通过类名或者类实例对象来调用,因为强调的是classmethod和staticmethod,所以在写代码的时候最好使用类名,良好的编程习惯吧。
对于staticmethod就是为了要在类中定义而设置的,一般来说很少这样使用,可以使用模块级(module-level)的函数来替代它。既然要把它定义在类中,想必有作者的考虑。
对于classmethod,可以通过子类来进行重定义。
提到类级别的函数,也顺带提及类级别的变量
class MyClass:
i = 123 # class-level variable
def __init__(self):
self.i = 456 # object-level variable
…
…
为了清晰地区分上面两个i,最好的办法就是考虑到python中的一切都是object,所以i=123属于class object的,i=456属于class instance object
建议继续学习:
- 配置Nginx+uwsgi更方便地部署python应用 (阅读:105163)
- 如何成为Python高手 (阅读:53091)
- python实现自动登录discuz论坛 (阅读:31388)
- python编程细节──遍历dict的两种方法比较 (阅读:18800)
- 每个程序员都应该学习使用Python或Ruby (阅读:16069)
- 使用python爬虫抓站的一些技巧总结:进阶篇 (阅读:11886)
- 30分钟3300%性能提升――python+memcached网页优化小记 (阅读:11812)
- 我的PHP,Python和Ruby之路 (阅读:11668)
- Python处理MP3的歌词和图片 (阅读:8105)
- 关于使用python开发web应用的几个库总结 (阅读:7307)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:ISADBA|FH.CN 来源: ISADBA|FH.CN
- 标签: class method Python static method
- 发布时间:2015-04-08 14:21:35
- [11] 解决 ubuntu 的 /etc/hosts
- [9] 文言文白话文互转:文言文转白话文(现代文),
- [8] 用邻接表实现无向图
- [7] Http/2知识图谱
- [7] 领导需要比下属更懂技术吗?
- [6] 说说lighttpd的fastcgi
- [6] 查看 Apache并发请求数及其TCP连接状
- [6] 新手产品经理都混哪里
- [6] 活动 Web 页面人机识别验证的探索与实践
- [6] 近场通信 vs. 低功耗蓝牙:如何抉择