# coding:utf-8
# 第17课 强大的装饰器
import functools
import time
if __name__ == "__main__":
# 函数作为变量
def func(message):
print("收到一个消息:{}".format(message))
send_message = func
send_message("hello world")
# 函数作为参数
def root_call(fun, message):
print(fun(message))
root_call(func, "函数参数")
# 函数嵌套
def fund(message):
def get_message(message):
print("收到一个消息:{}".format(message))
return get_message(message)
fund("函数嵌套")
# 闭包
def func_closure():
def get_message(message):
print("收到一个消息:{}".format(message))
return get_message
send_message = func_closure()
send_message("返回函数对象(闭包)")
# 简单装饰器例子
def my_decorator(func):
def wrapper():
print("装饰器")
func()
return wrapper
def greet():
print("你好")
greet = my_decorator(greet)
greet()
# 原函数还是原函数吗?
print(greet.__name__)
print(help(greet))
# 使用functools.wrap
def my_decorator2(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
print("functools的装饰器")
func(*args, **kwargs)
return wrapper
@my_decorator2
def greet2(message):
print(message)
greet2("functools")
print(greet2.__name__)
# 类装饰器
class Count():
def __init__(self, func):
self.func = func
self.num_calls = 0
def __call__(self, *args, **kwargs):
self.num_calls += 1
print("num of call is: {}".format(self.num_calls))
return self.func(*args, **kwargs)
@Count
def example():
print("类装饰器")
example()
example()
# 装饰器嵌套
def my_decorator_a(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
print("functools的装饰器a")
func(*args, **kwargs)
return wrapper
def my_decorator_b(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
print("functools的装饰器b")
func(*args, **kwargs)
return wrapper
@my_decorator_a
@my_decorator_b
def greet3(message):
print(message)
greet3("functools")
print(greet3.__name__)
# 应用举例 给函数加上计时功能
def log_execution_time(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
start = time.perf_counter()
res = func(*args, **kwargs)
end = time.perf_counter()
print("函数{}运行耗时{}秒".format(func.__name__, end-start))
return res
return wrapper
@log_execution_time
def add(n):
s = 0
for i in range(n):
s += i
return s
res = add(10000)
print(res)
@log_execution_time
def multiply(n):
s = 1
for i in range(n):
s = s*(i+1)
return s
res = multiply(10000)
print(res)
没有合适的资源?快使用搜索试试~ 我知道了~
python模块化、对象比较与拷贝、函数装饰传递、装饰器.zip
共18个文件
py:10个
pyc:6个
ds_store:2个
需积分: 1 0 下载量 55 浏览量
2023-12-19
21:14:35
上传
评论
收藏 30KB ZIP 举报
温馨提示
python模块化、对象比较与拷贝、函数装饰传递、装饰器
资源推荐
资源详情
资源评论
收起资源包目录
python模块化、对象比较与拷贝、函数装饰传递、装饰器.zip (18个子文件)
python模块化、对象比较与拷贝、函数装饰传递、装饰器
.DS_Store 6KB
zsq.py 3KB
obcopy.py 1KB
模块化
.DS_Store 6KB
main.py 301B
src
sub_main.py 297B
utils
utils.py 74B
class_utils.py 194B
__pycache__
class_utils.cpython-37.pyc 672B
utils.cpython-37.pyc 204B
test1
src
main.py 233B
utils
__pycache__
mat_mul.cpython-37.pyc 801B
mat_mul.py 421B
proto
mat.py 172B
__pycache__
mat.cpython-37.pyc 426B
__pycache__
class_utils.cpython-37.pyc 715B
utils.cpython-37.pyc 247B
canshu.py 867B
共 18 条
- 1
资源评论
武昌库里写JAVA
- 粉丝: 3228
- 资源: 1925
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功