【Python3】--- 装饰器

    xiaoxiao2022-07-07  220

    在python3中 迭代器 生成器 装饰器 理解比较难

    1、装饰器本质上是一个python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象,装饰器的本质是函数,主要用来装饰其他函数,也就是为其他函数添加附加功能

    2、装饰器的原则:

    (1) 装饰器不能修改被装饰的函数的源代码

    (2) 装饰器不能修改被装饰的函数的调用方式


    函数


    (1)装饰器的原型:

    import time def showtime(func): def wrapper(): start_time = time.time() func() end_time = time.time() print('spend is {}'.format(end_time - start_time)) return wrapper def foo(): #原函数不可以改变 print('foo..') time.sleep(3) foo = showtime(foo) # foo()

    (2)不带参数的装饰器:(装饰器,被装饰函数都不带参数)

    import time def showtime(func): def wrapper(): start_time = time.time() func() end_time = time.time() print('spend is {}'.format(end_time - start_time)) return wrapper @showtime #foo = showtime(foo) def foo(): print('foo..') time.sleep(3) @showtime #doo = showtime(doo) def doo(): print('doo..') time.sleep(2) foo() doo()

    语法:@ 

    装饰器便捷方法在 函数体上方写@showtime   与 foo = showtime(foo)相同

     

    (3)带参数的被装饰的函数

    import time def showtime(func): def wrapper(a, b): start_time = time.time() func(a,b) end_time = time.time() print('spend is {}'.format(end_time - start_time)) return wrapper @showtime #add = showtime(add) def add(a, b): print(a+b) time.sleep(1) @showtime #sub = showtime(sub) def sub(a,b): print(a-b) time.sleep(1) add(5,4) sub(3,2)

    (4)带参数的装饰器(装饰函数),

    import time def time_logger(flag = 0): def showtime(func): def wrapper(a, b): start_time = time.time() func(a,b) end_time = time.time() print('spend is {}'.format(end_time - start_time)) if flag: print('将此操作保留至日志') return wrapper return showtime @time_logger(2) #得到闭包函数showtime,add = showtime(add) def add(a, b): print(a+b) time.sleep(1) add(3,4)

    (5)装饰器语法总结

    def myDecorator(...):    #定义装饰器,可能带参数 def decorator(func): #装饰器核心,以被装饰的函数对象为参数,返回装饰后的函数对象 def wrapper(*args, **kvargs): #装饰的过程,参数列表适应不同参数的函数 ... #修改函数调用前的行为 func(*args, **kvargs) #调用函数 ... #修改函数调用后的行为 return wrapper return decorator @myDecorator(...):    #给函数加上装饰器 def myFunc(...):     #自己定义的功能函数 ...

    类 (class)


    Python内置装饰器

    在Python中有三个内置的装饰器,都是跟class相关的:staticmethod、classmethod 和property。

    staticmethod 是类静态方法,其跟成员方法的区别是没有 self 参数,并且可以在类不进行实例化的情况下调用classmethod 与成员方法的区别在于所接收的第一个参数不是 self (类实例的指针),而是cls(当前类的具体类型)property 是属性的意思,表示可以通过通过类实例直接访问的信息 import time class Foo(object): def __init__(self, func): self._func = func def __call__(self): start_time = time.time() self._func() end_time = time.time() print('spend is {}'.format(end_time - start_time)) @Foo #bar = Foo(bar) def bar(): print('bar..') time.sleep(2) bar()

     

    最新回复(0)