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

  • 相关阅读:
    android 75 新闻列表页面
    android 74 下载文本
    android 73 下载图片
    android 72 确定取消对话框,单选对话框,多选对话框
    android 71 ArrayAdapter和SimpleAdapter
    android 70 使用ListView把数据显示至屏幕
    maven如何将本地jar安装到本地仓库
    Centos6.7搭建ISCSI存储服务器
    解决maven打包编译出现File encoding has not been set问题
    MySQL 解决 emoji表情 的方法,使用utf8mb4 字符集(4字节 UTF-8 Unicode 编码)
  • 原文地址:https://www.cnblogs.com/douzi2/p/5580713.html
Copyright © 2011-2022 走看看