日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python中的类装饰器应用场景_Python 自定义装饰器使用写法及示例代码

發(fā)布時(shí)間:2023/12/15 python 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python中的类装饰器应用场景_Python 自定义装饰器使用写法及示例代码 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1、Python裝飾器簡(jiǎn)介

python的裝飾器就是一個(gè)Python函數(shù),它可以讓其他函數(shù)在不需要做任何代碼變動(dòng)的前提下增加額外功能,裝飾器的返回值也是一個(gè)函數(shù)對(duì)象。簡(jiǎn)單的說(shuō)裝飾器就是一個(gè)用來(lái)返回函數(shù)的函數(shù)。

它經(jīng)常用于有切面需求的場(chǎng)景,比如:插入日志、性能測(cè)試、事務(wù)處理、緩存、權(quán)限校驗(yàn)等場(chǎng)景。裝飾器是解決這類問(wèn)題,代碼很好地重用。簡(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ù)的元信息問(wèn)題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)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。