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

       

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

  • 相关阅读:
    ClickOnce發布經驗
    reporting Server組件不全引起的致命錯誤
    異步調用
    Usercontrol Hosted in IE
    MATLAB命令大全(转载)
    一种保护眼睛的好方法
    关于oracle自动编号
    An Algorithm Summary of Programming Collective Intelligence (1)
    An Algorithm Summary of Programming Collective Intelligence (3)
    An Algorithm Summary of Programming Collective Intelligence (4)
  • 原文地址:https://www.cnblogs.com/ljxh/p/11288712.html
Copyright © 2020-2023  润新知