在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()
网友评论