zoukankan      html  css  js  c++  java
  • python装饰器

    装饰器:是一个以闭包形式的函数;在不改变现函数的的基础上增加其它功能。

    格式:@装饰器函数名(外函数名)

    demo:

    import time  # 调用时间模块

    def count_time(func):  # 外部函数

      def wrapper():  # 内函数

        start = time.time()  # 开始时间

        func()  

        end = time.time()  # 结束时间

        print("共计执行:%f秒" % (end - starat))

      return wrapper  # 返回内函数的函数引用,即函数名

    @count_time  # 装饰器语法:@外函数名,等同于my_count = count_time(my_count)

    def my_count()

      s = 0

      for i in range(1000001):

        s += i

      print(s)

    my_count()

      

    装饰器的格式:装饰器的格式为四种,分别是由有无参数,有无返回值组成

    万能装饰器:通过使用可变参数和关键字参数来接收不同的参数类型。

    def set_func(func):
        def wrapper(*args, **kwargs):  # *args接收可变参数,**kwargs接收关键字参数
            print("wrapper context")
            return func(*args, **kwargs)
    
    
        return wrapper
    
    
    @set_func
    def show(name, age):
        print(name, age)
    
    
    show("tom", 12)               
                    

    类实现装饰器功能:在类中通过__init__和__call__方法来实现;

    class Test(object):
        def __init__(self, func):   # 初始化方法导入要装饰的函数
            self.__func = func
        def __call__(self, *args, **kwargs):  # 重写__call__方法来实现装饰内容
            print("hello python")
            self.__func(*args, **kwargs)
    
    
    @Test  # 等同于show = Test(show) show由函数引用变为类对象
    def show():
        pass
    
    
    show()  # 对象调用方法,原理是调用__call__魔法方法

    带参数的装饰器

    def func1(name1, age1):  # 在原有闭包的基础上,定义个最外层的函数,来接收装饰器参数
        def func2(func):
            def func3(name, age):
                # func(name, age)
                print(name1, age1)
                return func(name, age)
            return func3
        return func2
    
    
    @func1('guo', 1)
    def func(name, age):
        print("%s: %d" % (name, age))
    
    
    func('xiaoguo', 27)

    函数可以被多个装饰器所装饰:装饰过程是由下至上

  • 相关阅读:
    Jquery源码分析(一)
    Lazyload 延迟加载效果
    20100128
    Linux共享库(so)动态加载和升级
    shell 数组
    Git常用命令解说
    linux shell 数组建立及使用技巧
    linux下查看用户及用户组的方法
    Zypper 用法
    linux shell 数组的长度计算、修改、循环输出等操作
  • 原文地址:https://www.cnblogs.com/guo126/p/9638315.html
Copyright © 2011-2022 走看看