yandyand

导航

python之装饰器

# def foo():
# print("I am foo")
#
# foo = use_logging(foo)
#
# foo()
"""
use_logging(foo)
wrapper == foo
foo() == wrapper()

1.首先先执行foo被赋值为use_logging(foo)
use_logging(foo):
return wrapper
此时 foo == wrapper
下面又执行了foo() == wrapper()
打印日志 %s is running %func.__name__ 因为use_logging(func) 中 func == foo
所以%func == foo.__name__
之后return func()
就是在返回foo()
调用foo函数:
I am foo
"""

# def use_logging(func):
# def wrapper():
# logging.warn("%s is running"%func.__name__)
# return func()
# return wrapper
#
# @use_logging
# def foo():
# print("I am foo")
# foo()
"""
第一次调用时func == foo
进入到函数体内部时:use_logging
foo == wrapper
外部的foo() == wrapper()
在执行wrapper()函数中的内容 %s == func == foo
return func() == foo()
在执行foo()函数
I am foo
"""


# def day(func):
#
# def today():
# print("我叫杨洋")
# return func()
# return today
#
# @day
# def xinqing():
# print("心情很不错!")
#
# xinqing()

# def day(func):
#
# def names():
# print("我叫做杨洋")
# return func()
# return names
#
# @day
# def today():
# print("今天是周六")
# today()


# def foo(name):
# print("I am %s"%name)
#
# foo("yang")


# def use_logging(func):
# def wrapper(*args):
# logging.warn("%s is running"%func.__name__)
# return func(*args)
# return wrapper
#
# @use_logging
# def foo(name,age = 21,height = 175):
# print("I am %s, i'am %s years old,my height is %s"%(name,age,height))
#
# foo("杨洋")
"""
首先代码执行到检测装饰器"@use_logging"
这时下面的函数名字被传递到use_logging(func) 中的 func传参中 此时 func == foo
因为执行调用了use_logging函数所以>>>>
执行调用use_logging函数里面的函数"wrapper"
wrapper函数里面返回了wrapper 这个过程称之为"闭包"
首先返回了wrapper 所以此时的foo == wrapper
代码的下方执行了foo() 因为上面的wrapper返回了wrapper 所以此时foo() == wrapper()
执行调用wrapper() 函数里面的内容
logging.wran("%s is running"%func.__name__)因为func == foo 所以打印:
"WARNING:root:foo is running" foo == func
wrapper函数内容继续往下执行调用func()
因为func == foo 所以 func() == foo()
执行调用foo()
foo()函数内部打印
"I am foo"
整体函数执行完毕
"""

###########################传递多个参数############################

# def use_logging(func):
# def wrapper(*args,**kwargs):
# logging.warn("%s is running"%func.__name__)
# return func(*args,**kwargs)
# return wrapper
#
# def foo(name,age=21,depct="技术"):
# print("我叫%s,我今年%s,我的职业是%s"%(name,age,depct))
#
# foo("杨洋")

##################装饰器提供参数######################
# def use_logging(level):
# def decorator(func):
# def wrapper(*args,**kwargs):
# if level == "warn":
# logging.warn("%s is running"%func.__name__)
# elif level == "info":
# logging.info("%s is running"%func.__name__)
# return func(*args)
# return wrapper
# return decorator
#
# @use_logging(level="warn")
# def foo(name = "foo"):
# print("I am %s"%name)
#
# foo()
"""
首先执行装饰器调用函数use_logging 并且将装饰器里面的level值进行赋值 level == warn
然后下面的函数名foo被执行到use_logging中
此时跳转到use_logging函数
执行里面的decorator(func)函数 此时func == foo
在执行内置函数里的内置函数"wrapper"
此时*args **kwargs代表接收所有传入的参数值
wrapper函数内进行判断level
因为装饰器在装饰函数use_logging的时候就已经定义了level == warn
所以进行下面的判断,level == warn 执行:
打印日志告警 传入func 变量 func == foo
之后在返回 func(*args) func == foo func(*args) == foo(*args) foo(name = "foo")
执行调用foo函数
打印"I am %s(name)" name == foo == I am foo
"""






import time
# def foo(fn):
# start = time.time() #:记录时间
# fn()
# run = time.time() - start
# print(run)

# def outher(fn): #:2:执行outher fn 传参被传入 func fn == func
# def inner():
# start = time.time()
# fn() #:5:因为fn 传参已经被传入func 所以 fn() == func()
# run = time.time() - start
# print(run)
# return inner #:3:返回inner 给 func 因为是func调用的outher 所以inner返回给func
# @outher #:1:func 调用 outher
# def func():
# for i in range(99999):
# pass
# print("hello")
# func() #:4:func == inner == inner()



# import time
# def decorator(func):
# def wrapper(*args,**kwargs):
# start_time = time.time()
# func()
# end_time = time.time() - start_time
# print(end_time)
# return wrapper
#
# @decorator #:在装饰器这里相当于 decorator(func)
# def func():
# time.sleep(0.8)
# func()

posted on 2020-06-20 18:23  yandyand  阅读(134)  评论(0编辑  收藏  举报