裝飾器:本質上就是python的函式,它的最大特點就是採用切片的方式,在保證核心**不做修改的情況下進行切片控制如我們要實現乙個日誌收集的功能
執行結果:# 傳統方式
deftest1()
: log(
('第乙個'
)def
test2()
: log(
('第二個'
)def
log():
import inspect
method_name = inspect.stack()[
1][3
("log: 進入%s方法"
% method_name)
test1(
)test2(
)
我們再使用裝飾器來實現:
執行結果:def
log(func)
:def
(*args,
**kwargs)
("log: 進入%s方法"
% func.__name__)
return func(
*args,
**kwargs)
@log
deftest1()
('第乙個'
)@log
deftest2()
('第二個'
)# 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)
('log=%s: 進入%s方法'
%(level, func.__name__)
)return func(
*args,
**kwargs)
@log(level=
'error'
)def
test1()
('第乙個'
)test1(
)
有時候我們也要定義裝飾器類
wrapt模組class
logging
:def
__init__
(self, level=
'info'):
self.level = level
def__call__
(self, func)
:def
(*args,
**kwargs)
('log=%s: 進入%s方法'
%(self.level, func.__name__)
)return func(
*args,
**kwargs)
@logging(level=
'error'
)def
test1()
('第乙個'
)test1(
)
裝飾器需要進行巢狀,在巢狀裡對真實呼叫的操作方法進行包裝,wrapt模組,就是為了減少一層巢狀wrapt屬於第三方模組需要安裝
pip install wrapt
執行結果:@wrapt.decorator
deflogging
('log: 進入%s方法'
@logging
deftest1()
('第乙個'
)test1(
)
帶引數的還是需要包裝的:
def
log(level=
'info'):
@wrapt.decorator
def:print
('log=%s: 進入%s方法'%)
*args,
**kwargs)
@log(level=
'error'
)def
test1()
('第乙個'
)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...