在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()
