0
点赞
收藏
分享

微信扫一扫

量化交易之python篇 - 装饰器语法


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")

 

举报

相关推荐

0 条评论