• python之装饰器


    装饰器是一类特殊的函数,其可以在不改变原函数的功能的前提下,去拓展函数的功能,相当于装饰了一层新功能。装饰器有两大类函数装饰器和类装饰器,
    两类装饰器可以相互装饰,实现需要的功能。
    1.分类
    1.1 普通装饰器 def func(f): def wrap(*args,**kwargs): print("is using:",f.__name__) return f(*args,**kwargs) return wrap @func def max(): print("hello") max() 1.2 带参数的装饰器 定义带参数的装饰器时,其格式是在普通装饰器的基础上,再包裹一层。   def decorator(a):    def wrapper(func):    def wrapper1(*args,**kwargs):    return func(*args,**kwargs)    return wrapper1    return wrapper      @decorator(a=10)   def max(a,b):    print(a,b,a+b)      max(3,5)

    1.3 类装饰器
    类装饰器主要利用了魔术方法__call__的功能。在调用类时,自动执行__call__方法。
    class Decorator():
        def __init__(self, func):
            self.__func = func
    
        def __call__(self, *args, **kwargs):
            return self.__func()
    
    
    @Decorator
    def func():
        print("i am a usual function")
    
    
    func()

     2.多个装饰器同时装饰一个函数

    def decorator1(func):
        print("this is a decorator1")
    
        def wrapper(*args, **kwargs):
            print("1 is using wrapper")
            return func(*args, **kwargs)
    
        return wrapper
    
    
    def decorator2(func):
        print("this is a decorator2")
    
        def wrapper(*args, **kwargs):
            print("2 is using wrapper")
            return func(*args, **kwargs)
    
        return wrapper
    
    
    @decorator1
    @decorator2
    def func():
        print("i am a usual function")
    
    
    func()


    ******************
    调试结果如下:

    this is a decorator2
    this is a decorator1
    1 is using wrapper
    2 is using wrapper
    i am a usual function

    其执行原则:@符号接近函数的先被装饰。

    3.饰器路由功能:

    路由功能是装饰器的一大特色,通过利用@将被装饰的函数装入字典,以实现不同功能的统一调用。
    a={}
    def decorator(var):
    def wrapper1(func):
    a[var] = func #line2,将add的引用提前装入字典,
    def wrapper(*args, **kwargs):
    print(id(wrapper))
    return func(*args, **kwargs)
    return wrapper
    return wrapper1
    @decorator("name")#执行到这一步时,相当于add=wrapper
    def add():
    print(id(add),"add hanshu")#因@的作用,此处add的id是wrapper的id
    pass
    add()

      

  • 相关阅读:
    NXOpen 创建方体block代码
    Mysql---2 DDL DML DQL DCL
    Mysql数据库--1数据库操作
    FFmpeg
    Servlet Web
    Java web Springboot
    Java 网络
    Java 注解 反射
    Java 线程状态
    Java Lambda
  • 原文地址:https://www.cnblogs.com/xuehaiwuya0000/p/10850495.html
Copyright © 2020-2023  润新知