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应用 (阅读:105405)
- 如何成为Python高手 (阅读:53412)
- python实现自动登录discuz论坛 (阅读:31595)
- python编程细节──遍历dict的两种方法比较 (阅读:19005)
- 每个程序员都应该学习使用Python或Ruby (阅读:16275)
- 30分钟3300%性能提升――python+memcached网页优化小记 (阅读:12140)
- 使用python爬虫抓站的一些技巧总结:进阶篇 (阅读:12122)
- 我的PHP,Python和Ruby之路 (阅读:11851)
- Python处理MP3的歌词和图片 (阅读:8330)
- 关于使用python开发web应用的几个库总结 (阅读:7446)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:ISADBA|FH.CN 来源: ISADBA|FH.CN
- 标签: class method Python static method
- 发布时间:2015-04-08 14:21:35
- [51] Oracle MTS模式下 进程地址与会话信
- [49] 图书馆的世界纪录
- [49] IOS安全–浅谈关于IOS加固的几种方法
- [48] 如何拿下简短的域名
- [45] 【社会化设计】自我(self)部分――欢迎区
- [45] android 开发入门
- [42] 读书笔记-壹百度:百度十年千倍的29条法则
- [41] Go Reflect 性能
- [41] 界面设计速成
- [40] 视觉调整-设计师 vs. 逻辑