【写在前面】

  本帖归属于装饰器单元的学习,可以点击关键词‘装饰器’查看其他博文讲解

【正文部分】

  说到装饰器一开始我觉得很陌生,看了一下别人的博客讲解,原来以前学习遇到的静态方法@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

 

博主尊重原创,也支持原创,如有侵权,联系博主删帖,转帖请注明出处!

最新文章

  1. MongoDB学习笔记~官方驱动的原生Curd操作
  2. web app上传图片
  3. 想要提高网页转换率?试试这16 个UI 秘诀
  4. mysql在Windows下使用mysqldump命令备份数据库
  5. javascript 原型链
  6. 【转】Phonegap离线调用SQLite数据库文件
  7. git 撤销修改以及删除文件
  8. c语言结构体使用方法
  9. C#中IDisposable
  10. Python字典详解
  11. 【Android Developers Training】 43. 序言:管理音频播放
  12. SSM-SpringMVC-11:SpringMVC中ParameterMethodNameResolver参数方法名称解析器
  13. excel打开csv格式的文件,数字末尾都变成零,解决方式
  14. 一口一口吃掉Hexo(六)
  15. Oracle数据库的基本查询
  16. Yii together
  17. uva 816 abbott&amp;#39;s revenge ——yhx
  18. mysql创建、删除用户与授权(linux測试)
  19. Mysql5.7.22版本,插入中文乱码的问题
  20. Flexbox 完全指南

热门文章

  1. BUUCTF-[CISCN2019 华北赛区 Day1 Web5]CyberPunk
  2. 太空大战-GUI实现(1)
  3. tomcat配置启动不了
  4. shell脚本测试变量是否为空,测试文件是否存在,sed修改配置文件参数,分支语句
  5. Java单例-双重检查锁
  6. wpf内存泄漏问题
  7. 论文解读(DGI)《DEEP GRAPH INFOMAX》
  8. 洛谷P1582——倒水(进制,数学)
  9. js屏蔽右键代码
  10. P1013 [NOIP1998 提高组] 进制位