浅尝装饰器-@staticmethod 和@classmethod
【写在前面】
本帖归属于装饰器单元的学习,可以点击关键词‘装饰器’查看其他博文讲解
【正文部分】
说到装饰器一开始我觉得很陌生,看了一下别人的博客讲解,原来以前学习遇到的静态方法@staticmethod和类方法@classmethod就是一种python内置装饰器。那就开始讲讲Python中的方法。
python中常见的方法有:静态方法(staticmethod)、类方法(classmethod)和实例方法,如下:
# 备注:下面给出的是四个方法,从上到下依次是:一般函数(不能算方法),实例化方法、类方法、静态方法
def foo(x):
print "executing foo(%s)"%(x) 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()
这里先理解下函数参数里面的self和cls:这个self和cls是对实例和类的绑定。
1、对于一般的函数来说我们可以这么调用foo(x),这个函数就是最常用的,它的工作跟任何东西(类,实例)无关.
2、对于实例方法,我们知道在类里每次定义方法的时候都需要绑定这个实例,就是foo(self, x),为什么要这么做呢?因为实例方法的调用离不开实例,我们需要把实例自己传给函数,调用的时候是这样的a.foo(x)(其实是foo(a, x)).
3、类方法一样,只不过它传递的是类而不是实例,A.class_foo(x). 注意这里的self和cls可以替换别的参数,但是python的约定是这俩,还是不要改的好.
对于静态方法@staticmethod 其实和普通的方法一样,不需要对谁进行绑定,唯一的区别是调用的时候需要使用a.static_foo(x)或者A.static_foo(x)来调用.
常见的3中方法对比如下:
【写在最后】
这里作个小结:
1、静态方法@staticmethod只在内存中生成一个,节省开销。
>>> c1.static = C.static
>>> c1.static is C.static
True
>>> c1.nostatic is C.nostatic
False
>>> c1.static
<function C.static at 0x000001BEEE1EC2F0>
>>> c2.static
<function C.static at 0x000001BEEE1EC2F0>
>>> C.static
<function C.static at 0x000001BEEE1EC2F0>
2、实例化方法的实例对象都拥有独立的一个ID,开销较大。
>>> c1.nostatic
<bound method C.nostatic of <__main__.C object at 0x000001BEF0611E10>>
>>> c2.nostatic
<bound method C.nostatic of <__main__.C object at 0x000001BEF06337F0>>
>>> C.nostatic
<function C.nostatic at 0x000001BE
博主尊重原创,也支持原创,如有侵权,联系博主删帖,转帖请注明出处!
最新文章
- MongoDB学习笔记~官方驱动的原生Curd操作
- web app上传图片
- 想要提高网页转换率?试试这16 个UI 秘诀
- mysql在Windows下使用mysqldump命令备份数据库
- javascript 原型链
- 【转】Phonegap离线调用SQLite数据库文件
- git 撤销修改以及删除文件
- c语言结构体使用方法
- C#中IDisposable
- Python字典详解
- 【Android Developers Training】 43. 序言:管理音频播放
- SSM-SpringMVC-11:SpringMVC中ParameterMethodNameResolver参数方法名称解析器
- excel打开csv格式的文件,数字末尾都变成零,解决方式
- 一口一口吃掉Hexo(六)
- Oracle数据库的基本查询
- Yii together
- uva 816 abbott&;#39;s revenge ——yhx
- mysql创建、删除用户与授权(linux測试)
- Mysql5.7.22版本,插入中文乱码的问题
- Flexbox 完全指南