浅尝装饰器-@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

   

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

原文地址:https://www.cnblogs.com/ljxh/p/11288712.html