zoukankan      html  css  js  c++  java
  • 浅尝装饰器-@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

       

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

  • 相关阅读:
    Ubuntu14.0.4 64位 ADT 连接手机调试问题
    Ubuntu14.0.4 64位安装ADT问题
    Uubntu scrot 的简单使用
    Ubuntu14.0.4 64位安装Chrome浏览器
    Android DatePickerDialog 只选择年月
    Java 正则提取数字串
    客户端HttpClient处理 Servlet Gzip
    Ext常用Tool
    python使用 requirements.txt 管理所需的包
    PyQt5安装及ModuleNotFoundError: No module named 'PyQt5'问题解决
  • 原文地址:https://www.cnblogs.com/ljxh/p/11288712.html
Copyright © 2011-2022 走看看