python中的类装饰器应用场景_Python 自定义装饰器使用写法及示例代码
1、Python裝飾器簡(jiǎn)介
python的裝飾器就是一個(gè)Python函數(shù),它可以讓其他函數(shù)在不需要做任何代碼變動(dòng)的前提下增加額外功能,裝飾器的返回值也是一個(gè)函數(shù)對(duì)象。簡(jiǎn)單的說裝飾器就是一個(gè)用來返回函數(shù)的函數(shù)。
它經(jīng)常用于有切面需求的場(chǎng)景,比如:插入日志、性能測(cè)試、事務(wù)處理、緩存、權(quán)限校驗(yàn)等場(chǎng)景。裝飾器是解決這類問題,代碼很好地重用。簡(jiǎn)單理解,裝飾器的作用就是為已經(jīng)存在的對(duì)象添加額外的功能。
2、Python內(nèi)置裝飾器
3、Python裝飾器語(yǔ)法及原理
python提供了@符號(hào)作為裝飾器的語(yǔ)法糖,使我們更方便的應(yīng)用裝飾函數(shù)。但使用語(yǔ)法糖要求裝飾函數(shù)必須return一個(gè)函數(shù)對(duì)象。因此我們將上面的func函數(shù)使用內(nèi)嵌函數(shù)包裹并return。
裝飾器相當(dāng)于執(zhí)行了裝飾函數(shù)use_loggin后又返回被裝飾函數(shù)bar,因此bar()被調(diào)用的時(shí)候相當(dāng)于執(zhí)行了兩個(gè)函數(shù)。等價(jià)于use_logging(bar)()def use_logging(func):
def _deco():
print("%s is running" % func.__name__)
func()
return _deco
@use_logging
def bar():
print('i am bar')
bar()
4、Python裝飾器的使用
1)裝飾器修飾帶參數(shù)方法def use_logging(func):
def _deco(a,b):
print("%s is running" % func.__name__)
func(a,b)
return _deco
@use_logging
def bar(a,b):
print('i am bar:%s'%(a+b))
bar(1,2)
2)裝飾器修飾不確定參數(shù)個(gè)數(shù)方法def use_logging(func):
def _deco(*args,**kwargs):
print("%s is running" % func.__name__)
func(*args,**kwargs)
return _deco
@use_logging
def bar(a,b):
print('i am bar:%s'%(a+b))
@use_logging
def foo(a,b,c):
print('i am bar:%s'%(a+b+c))
bar(1,2)
foo(1,2,3)
3)帶參數(shù)的裝飾器#! /usr/bin/env python
# -*- coding:utf-8 -*-
# __author__ = "TKQ"
def use_logging(level):
def _deco(func):
def __deco(*args, **kwargs):
if level == "warn":
print "%s is running" % func.__name__
return func(*args, **kwargs)
return __deco
return _deco
@use_logging(level="warn")
def bar(a,b):
print('i am bar:%s'%(a+b))
bar(1,3)
# 等價(jià)于use_logging(level="warn")(bar)(1,3)
4)使用functools.wraps解決原函數(shù)的元信息問題import functools
def use_logging(func):
@functools.wraps(func)
def _deco(*args,**kwargs):
print("%s is running" % func.__name__)
func(*args,**kwargs)
return _deco
@use_logging
def bar():
print('i am bar')
print(bar.__name__)
bar()
#result:
#bar is running
#i am bar
#bar
5、裝飾器同時(shí)兼容帶參數(shù)和不帶參數(shù)的情況import functools
def use_logging(arg):
if callable(arg):#判斷傳入的參數(shù)是否是函數(shù),不帶參數(shù)的裝飾器調(diào)用這個(gè)分支
@functools.wraps(arg)
def _deco(*args,**kwargs):
print("%s is running" % arg.__name__)
arg(*args,**kwargs)
return _deco
else:#帶參數(shù)的裝飾器調(diào)用這個(gè)分支
def _deco(func):
@functools.wraps(func)
def __deco(*args, **kwargs):
if arg == "warn":
print "warn%s is running" % func.__name__
return func(*args, **kwargs)
return __deco
return _deco
@use_logging("warn")
# @use_logging
def bar():
print('i am bar')
print(bar.__name__)
bar()
6、類的裝飾器的使用class loging(object):
def __init__(self,level="warn"):
self.level = level
def __call__(self,func):
@functools.wraps(func)
def _deco(*args, **kwargs):
if self.level == "warn":
self.notify(func)
return func(*args, **kwargs)
return _deco
def notify(self,func):
# logit只打日志,不做別的
print "%s is running" % func.__name__
@loging(level="warn")#執(zhí)行__call__方法
def bar(a,b):
print('i am bar:%s'%(a+b))
bar(1,3)
#繼承擴(kuò)展類的裝飾器
class email_loging(Loging):
'''
一個(gè)loging的實(shí)現(xiàn)版本,可以在函數(shù)調(diào)用時(shí)發(fā)送email給管理員
'''
def __init__(self, email='admin@myproject.com', *args, **kwargs):
self.email = email
super(email_loging, self).__init__(*args, **kwargs)
def notify(self,func):
# 發(fā)送一封email到self.email
print "%s is running" % func.__name__
print "sending email to %s" %self.email
@email_loging(level="warn")
def bar(a,b):
print('i am bar:%s'%(a+b))
bar(1,3)
總結(jié)
以上是生活随笔為你收集整理的python中的类装饰器应用场景_Python 自定义装饰器使用写法及示例代码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2022年零售上市公司品牌价值榜公布 阿
- 下一篇: vivo总裁新年致辞:埋头打造伟大产品