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应用 (阅读:106243)
- 如何成为Python高手 (阅读:54349)
- python实现自动登录discuz论坛 (阅读:32307)
- python编程细节──遍历dict的两种方法比较 (阅读:19774)
- 每个程序员都应该学习使用Python或Ruby (阅读:17300)
- 30分钟3300%性能提升――python+memcached网页优化小记 (阅读:13112)
- 使用python爬虫抓站的一些技巧总结:进阶篇 (阅读:12757)
- 我的PHP,Python和Ruby之路 (阅读:12615)
- Python处理MP3的歌词和图片 (阅读:9120)
- 关于使用python开发web应用的几个库总结 (阅读:8110)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:ISADBA|FH.CN 来源: ISADBA|FH.CN
- 标签: class method Python static method
- 发布时间:2015-04-08 14:21:35
-
[917] WordPress插件开发 -- 在插件使用 -
[135] 解决 nginx 反向代理网页首尾出现神秘字 -
[54] 整理了一份招PHP高级工程师的面试题 -
[52] Innodb分表太多或者表分区太多,会导致内 -
[52] 海量小文件存储 -
[52] 如何保证一个程序在单台服务器上只有唯一实例( -
[51] 全站换域名时利用nginx和javascri -
[50] 用 Jquery 模拟 select -
[49] CloudSMS:免费匿名的云短信 -
[48] jQuery性能优化指南
