• 谈谈对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() 调用,而无需绑定实例对象了。

  • 相关阅读:
    Java 线程终止
    Android Jetpack架构之ProcessLifeCycleOwner
    Android Jetpack架构之LifecycleService
    Android Jetpack架构之Lifecycle
    Android Jetpack架构
    深入理解JNI技术
    Java虚拟机类加载器机制
    Java HashMap、HashTable、ConcurrentHashMap区别
    Java内存分配策略
    Java 方法分派
  • 原文地址:https://www.cnblogs.com/douzi2/p/5580713.html
Copyright © 2020-2023  润新知