import time
# 定义两个简单函数的功能
def add(a, b):
start_time = time.time()
time.sleep(3)
result = a + b
end_time = time.time()
print("start time of function add: %s" % start_time)
print("end time of function add: %s" % end_time)
print("run time of function add: %d" % (end_time - start_time))
return result
def sub(a, b):
start_time = time.time()
time.sleep(3)
result = a - b
end_time = time.time()
print("start time of function sub: %s" % start_time)
print("end time of function sub: %s" % end_time)
print("run time of function sub: %d" % (end_time - start_time))
return result
add(3, 4)
sub(5, 6)
# 为计算运行时间 设计装饰器
def decorate_runtime(function):
def time_calculate(*args, **kwargs):
start_time = time.time()
time.sleep(3)
result = function(*args, **kwargs)
end_time = time.time()
print("start time of function %s: %s" % (function.__name__, start_time))
print("end time of function %s: %s" % (function.__name__, end_time))
print("run time of function %s: %d" % (function.__name__, end_time - start_time))
return result
return time_calculate
@decorate_runtime
def add(a, b):
return a + b
@decorate_runtime
def sub(a, b):
return a - b
print(add(3, 4))
print(sub(5, 6))
# 装饰器 (无参数)
def beyond_function(function):
print("-----beyond_function-----")
def use_function(*args, **kwargs):
print("-----use_function-----1")
function(*args, **kwargs)
print("-----use_function-----2")
# return function_test(some_number) # 装饰器有返回值类型
return use_function
@beyond_function
def function_test(number=0):
print("-----function_test-----%.2f" % number)
# return number # 装饰器有返回值类型
function_test(30)
# 装饰器 (带参数)
def set_level(level_number): # level_number: 装饰器参数
def set_function(function): # function: 被装饰的函数名
def call_function(*args, **kwargs): # (*args, **kwargs): 被装饰器修饰的函数的万能参数
if 1 == level_number:
print("level number: %d, pass" % level_number)
elif 2 == level_number:
print("level number: %d, pass" % level_number)
return function(*args, **kwargs)
return call_function
return set_function
@set_level(level_number=1)
def test1(number=1):
show_number = "test" + str(number)
print("function: -----%s-----" % show_number)
return "function " + show_number
@set_level(level_number=2)
def test2(number=2):
show_number = "test" + str(number)
print("function: -----%s-----" % show_number)
return "function " + show_number
print(test1(number=3))
print(test2(number=4))
# 类装饰器 (无参数)
class Logging:
def __init__(self, function):
self.function = function
def __call__(self, *args, **kwargs):
print("[DEBUG]: enter function {function}".format(function=self.function.__name__))
return self.function(*args, **kwargs)
@Logging
def say_hello(number=100):
print("hello my python {number}".format(number=number))
say_hello(number=200)
# 类装饰器 (带参数)
class Logging:
def __init__(self, level="warn"):
self.level = level
def __call__(self, function):
def inside_function(*args, **kwargs):
print("[{level}] inside function:[{function}]".format(level=self.level, function=function.__name__))
function(*args, **kwargs)
return inside_function
@Logging(level="super warn")
def say(content="hello world"):
print("say {content}!".format(content=content))
say(content="hello my python")