python基礎之裝飾器的應用

2021-10-09 00:23:20 字數 4072 閱讀 6872

裝飾器:本質上就是python的函式,它的最大特點就是採用切片的方式,在保證核心**不做修改的情況下進行切片控制

如我們要實現乙個日誌收集的功能

# 傳統方式

deftest1()

: log(

)print

('第乙個'

)def

test2()

: log(

)print

('第二個'

)def

log():

import inspect

method_name = inspect.stack()[

1][3

]print

("log: 進入%s方法"

% method_name)

test1(

)test2(

)

執行結果:

我們再使用裝飾器來實現:

def

log(func)

:def

(*args,

**kwargs)

:print

("log: 進入%s方法"

% func.__name__)

return func(

*args,

**kwargs)

@log

deftest1()

:print

('第乙個'

)@log

deftest2()

:print

('第二個'

)# def log():

# import inspect

# method_name = inspect.stack()[1][3]

# print("log: 進入%s方法" % method_name)

test1(

)test2(

)

執行結果:

函式的執行過程:

有時候我們還要確定日誌的型別

如info或error

# 帶引數的裝飾器

deflog

(level=

'info'):

def(func)

:def

(*args,

**kwargs)

:print

('log=%s: 進入%s方法'

%(level, func.__name__)

)return func(

*args,

**kwargs)

@log(level=

'error'

)def

test1()

:print

('第乙個'

)test1(

)

執行結果:

有時候我們也要定義裝飾器類

class

logging

:def

__init__

(self, level=

'info'):

self.level = level

def__call__

(self, func)

:def

(*args,

**kwargs)

:print

('log=%s: 進入%s方法'

%(self.level, func.__name__)

)return func(

*args,

**kwargs)

@logging(level=

'error'

)def

test1()

:print

('第乙個'

)test1(

)

wrapt模組

裝飾器需要進行巢狀,在巢狀裡對真實呼叫的操作方法進行包裝,wrapt模組,就是為了減少一層巢狀

wrapt屬於第三方模組需要安裝

pip install wrapt

@wrapt.decorator

deflogging

:print

('log: 進入%s方法'

@logging

deftest1()

:print

('第乙個'

)test1(

)

執行結果:

帶引數的還是需要包裝的:

def

log(level=

'info'):

@wrapt.decorator

def:print

('log=%s: 進入%s方法'%)

*args,

**kwargs)

@log(level=

'error'

)def

test1()

:print

('第乙個'

)test1(

)

是否使用wrapt就看你的個人習慣了

這裡我們只說一下靜態方法裝飾器、類方法裝飾器、屬性裝飾器

靜態方法

class

info

: @staticmethod

deftest()

:print

('test'

)def

test1

(self)

:print

('aaaa'

)info.test(

)#test靜態方法可以被呼叫

info.test1(

)# test1類中的普通方法,不能被呼叫

類方法

class

info

: @classmethod

deftest

(cls)

:print

('test'

) cls(

).test1(

)#cls()相當於類的例項化,可以呼叫普通方法

deftest1

(self)

:print

('aaaa'

)info.test(

)# 類方法,可以被類直接呼叫

info.test1(

)# 類中普通方法,不能被類直接呼叫

屬性訪問

class

info

:def

__init__

(self, level)

: self.__level = level # 私有屬性

@property

deftest

(self)

:# test方法做屬性呼叫

print

(self.__level)

# 列印私有屬性

info1 = info(

'1111'

)info1.test # test方法被呼叫

python基礎之裝飾器

裝飾器的本質是乙個閉合函式,該閉合函式的自由變數是乙個函式,可以使 的重要性與擴充套件性大大加強。通過 後新增裝飾器函式 def checkparams fn 只接受字串的裝飾器 if isinstance strname,str 判斷是否是字串型別 return fn strname 如果是則呼叫...

Python基礎之裝飾器

器 工具 裝飾 新增新功能 裝飾器就是定義乙個函式,用該函式去為其他函式新增新功能開放封閉原則 針對上線的功能對拓展是開放的,但是對修改源 以及呼叫方式是封閉的 裝飾器就是在遵循開放封閉原則的前提下為被裝飾物件新增新功能 1 不修改被裝飾物件的源 1 不修改被裝飾物件的呼叫方式 需求 為index加...

Python基礎之裝飾器

器即函式 裝飾即修飾,意指為其他函式新增新功能。裝飾器定義 本質就是函式,功能是為其他函式新增新功能。1.不修改被裝飾函式的源 開放封閉原則 2.為被裝飾函式新增新功能後,不修改被修飾函式的呼叫方式。不用傳引數來使用裝飾器。以下的操作是為函式foo來增加新的計時功能 不改變原函式的 和呼叫方式 im...