zoukankan      html  css  js  c++  java
  • 谈谈对Python装饰器的理解

    装饰器,又名函数修饰符。笔者觉得函数修饰符,这个名字更能直观的反应他的作用。


    函数修饰符语法特征 :
             @ + 修饰符

    函数修饰符的装饰对象:
            函数修饰符,就是说他修饰的是函数,而不是其他的东西,不是类,也不是变量,就函数而已!

    修饰符本身可以是哪些东西:
       1、函数标签(C/C++的说法:函数指针)
       2、带有魔法方法__call__() 的类的类名
       3、Ptyhon内置修饰符

    修饰符的本质:
            一个可以接受函数作为参数的函数

    函数修饰符的工作原理:
       当一个函数被一个修饰符修饰之后,再次调用该函数时,该函数会作为一个参数传入该修饰符。结果是该修饰符返回的函数被调用

    1、修饰符为函数标签(C/C++的说法:函数指针)的例子:

    import time
     
    def timeslong(func):
        def call():
            start = time.clock()
            print("It's time starting ! ")
            func()
            print("It's time ending ! ")
            end = time.clock()
            return "It's used : %s ." % (end - start)
        return call
    
    @timeslong
    def f():
        y = 0
        for i in range(10):
            y = y + i + 1
            print(y)
        return y
    
    print(f())

    总结:当修饰符为函数便签时,注意该函数必须返回的是一个函数便签。因为,修饰符的本质是
            一个可以接受函数作为参数的函数。

    2、修饰符为带有魔法方法__call__() 的类的类名的例子:

    import time
    
    class timeslong(object):
        def __init__(self,func):
            self.f = func
        def __call__(self):
            start = time.clock()
            print("It's time starting ! ")
            self.f()
            print("It's time ending ! ")
            end = time.clock()
            return "It's used : %s ." % (end - start)
    
    @timeslong
    def f():
        y = 0
        for i in range(10):
            y = y + i + 1
            print(y)
        return y
    
    print(f())

    总结:当修饰符为类名时,注意该类必须有__call__的实例方法,被修饰的函数被调用时,会自动被传入__call__,之后__call__被调用。

    3、修饰符为Ptyhon内置修饰符的例子:(这个目前感觉没啥用,先copy小甲鱼的啦)         内置的修饰符有三个,分别是 staticmethod、classmethod 和 property,作用分别是把类中定义的实例方法变成静态方法、类方法和类属性。由于模块里可以定义函数,所以静态方法和类方法的用处并不是太多。

    class Hello(object):
        def __init__:
            ...
    
    @classmethod
    def print_hello(cls):
        print "Hello"

    classmethod 修饰过后,print_hello() 就变成了类方法,可以直接通过 Hello.print_hello() 调用,而无需绑定实例对象了。

  • 相关阅读:
    Fedora 19+ 启动顺序调整
    朗科U903 低级格式化后,量产错误:read onlypage (控制器芯片群联2251-03)的解决方案
    python中快速删除实例对象中的所有属性
    python中如何用sys.excepthook来对全局异常进行捕获、显示及输出到error日志中
    通过ctypes获得python windows process的内存使用情况
    Python的XMLRPC机制:实现跨进程间、client/server端通信
    PIL Image 转成 wx.Image、wx.Bitmap
    wxpython线程安全的方法
    11
    列表去重的几种方法
  • 原文地址:https://www.cnblogs.com/douzi2/p/5580713.html
Copyright © 2011-2022 走看看