ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python装饰器应用场景

2021-10-26 15:32:59  阅读:219  来源: 互联网

标签:场景 return python self func kwargs logfile 装饰 def


# -*- coding:utf-8 -*-
# 学习装饰器的一些常用场景

from functools import wraps

def decorator_name(f):
@wraps(f)
def decorated(*arg, **kwargs):
if not can_run:
return('Function will not run')
return f(*arg, **kwargs)
return decorated

@decorator_name
def func():
return('Function is running')

#can_run = True

#print(func())

can_run = False
print(func())
# 小结:@wraps接受一个函数来进行装饰,并加入了复制函数名称、注释文档、参数列表等功能。
# 这可以让我们在装饰器里面访问在装饰之前的函数的属性
"""
装饰器使用场景-授权(Authorization)
"""
# 装饰器能有助于检查某个人是否被授权去使用一个web应用的端点(endpoint)。它们被大量使用于
# Flask和Django web框架中。这里是一个例子来使用基于装饰器的授权
from functools import wraps

def requires_auth(f):
@wraps(f)
def decorated(*args, **kwargs):
auth = requests.authorization
if not auth or not check_auth(auth.username, auth.password):
authenticate()
return f(*args, **kwargs)
return decorated

"""
装饰器使用场景-日志(Logging)
"""
# 日志是装饰器运用的另一个亮点,这是个例子

from functools import wraps

def logit(func):
@wraps(func)
def with_logging(*args, **kwargs):
print(func.__name__ + "was called")
return func(*args, **kwargs)
return with_logging
@logit
def addition_func(x):
"""Do some math"""
return x + x

result = addition_func(4)
print(result)

"""
带参数的装饰器-在函数中嵌入装饰器
"""
from functools import wraps

def logit1(logfile='out.log'):
def logging_decorator(func):
@wraps(func)
def wrapped_function(*args, **kwargs):
log_string = func.__name__ + " was called"
print(log_string)
# 打开logfile,并写入内容
with open(logfile, 'a') as opened_file:
# 现在将日志打印到指定的logfile
opened_file.write(log_string + '\n')
return func(*args, **kwargs)
return wrapped_function
return logging_decorator
@logit1(logfile='fun2.log')
def myfun1():
pass
myfun1()

"""
装饰器类
"""
from functools import wraps

class logit2(object):
def __init__(self, logfile='out.log'):
self.logfile = logfile

def __call__(self, func):
@wraps(func)
def wrapped_function(*args, **kwargs):
log_string = func.__name__ + " was called"
print(log_string)
# 打开logfile,并写入内容
with open(self.logfile, 'a') as opened_file:
# 现在将日志打印到指定的logfile
opened_file.write(log_string + '\n')
# 现在,发送一个通知
self.notify()
return func(*args, **kwargs)
return wrapped_function

def notify(self):
print('logit只打日志,不做别的')
pass

@logit2()
def myfunc2():
print('调用通知')

print('------')
myfunc2()

# 现在,我们给logit创建子类,来添加email的功能
class email_logit(logit2):
"""
一个logit的实现版本,可以在函数调用时发送email给管理员
"""
def __init__(self, email='mecexia@tencent.com', *args, **kwargs):
self.email = email
super(email_logit, self).__init__(*args, **kwargs)

def notify(self):
# 发送一封email到self.email
# 这里就不做实现了
pass





标签:场景,return,python,self,func,kwargs,logfile,装饰,def
来源: https://www.cnblogs.com/relustarry/p/15466039.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有