python設計模式 裝飾器模式

2021-08-17 01:23:31 字數 4801 閱讀 6284

裝飾類方法

裝飾類物件方法

裝飾類functools 方法

類內建的裝飾器

python基礎-裝飾器高階

這篇部落格是學習各個方面的裝飾器,諸如裝飾方法、類、類方法、裝飾器庫functools

裝飾函式的裝飾器,就是為某個函式的執行前後,或者函式引數,進而對被裝飾的函式產生影響作用

def

(method):

definner

(a, b):

print("before...")

a = a + 1

b = b + 1

ret = method(a, b)

print("after...")

return ret

return inner

defmethod

(a, b):

print("run method")

return a + b

print(ret)

最終結果輸出如下:

before...

run method

after...

5

以上裝飾器我們還可以新增語法糖的方式,如下

def

(method):

definner

(a, b):

print("before...")

a = a + 1

b = b + 1

ret = method(a, b)

print("after...")

return ret

return inner

defmethod

(a, b):

print("run method")

return a + b

ret = method(1,2)

print(ret)

輸出結果沒有改變

以上裝飾器是裝飾了乙個函式,既然是函式,那我們看下能不能,裝飾類中的某個方法呢?

類中方法分為類方法,類物件方法

裝飾類方法不含語法糖

以下是裝飾類方法,從而在類呼叫operate方法時候,進行修改操作

class

foo():

a = 1

b = 2

defoperate

(self, a, b):

print("run operate")

return a + b

def(operate):

definner

(self, a, b):

print("before...")

a += 1

b += 1

ret = operate(self, a, b)

print("after...")

return ret

return inner

print(ret)

輸出如下:

run operate

after...

5裝飾類方法含語法糖

我們繼續優化,由於裝飾器修飾普通函式,可以用語法糖,那麼我們整個例子,能不能使用下語法糖呢?答案是可以的,請看如下**

def

(operate):

definner

(self, a, b):

print("before...")

a += 1

b += 1

ret = operate(self, a, b)

print("after...")

return ret

return inner

class

foo():

a = 1

b = 2

defoperate

(self, a, b):

print("run operate")

return a + b

ret = foo.operate(foo, 1, 2)

print(ret)

輸出如下:

run operate

after...5

以上是對類方法進行的裝飾,下面我們來看下對類物件方法看看能不能裝飾呢?

裝飾類物件方法不含語法糖

class

foo():

defoperate

(self,a,b):

print("run operate")

return a+b

def(operate):

definner

(a,b):

print("before...")

a += 1

b += 1

ret = operate(a, b)

print("after...")

return ret

return inner

foo = foo()

print(ret)

輸出如下:

run operate

after...

5裝飾類物件方法含語法糖

那麼我們就繼續利用語法糖來裝飾類物件的方法

def

(operate):

definner

(self,a,b):

print("before...")

a += 1

b += 1

ret = operate(self,a, b)

print("after...")

return ret

return inner

class

foo():

defoperate

(self,a,b):

print("run operate")

return a+b

foo = foo()

ret = foo.operate(1, 2)

print(ret)

輸出如下:

run operate

after...5

裝飾類不含語法糖

我們實現了裝飾修裝飾類方法,類物件方法,那麼接下來的直接裝飾就很容易了,如下**貼出來

class

foo():

defoperate

(self,a,b):

print("run operate")

return a+b

def(foo):

definner

(foo,a,b):

print("before...")

a+=1

b+=1

ret =foo.operate(foo,a,b)

print("after...")

return ret

return inner

print(ret)

輸出如下:

run operate

after...

5裝飾類含語法糖

我們修改下,裝飾類利用語法糖形式

def

(fooo):

definner

(foo,a,b):

print("before...")

a+=1

b+=1

ret =fooo.operate(fooo,a,b)

print("after...")

return ret

return inner

class

foo():

defoperate

(self,a,b):

print("run operate")

return a+b

ret = foo(foo,1,2)

print(ret)

輸出如下:

run operate

after...

5

from functools import  wraps

def(method):

@wraps(method)

definner

(a,b):

a = a + 1

b = b + 1

print("before")

ret = method(a,b)

print("after")

return ret

return inner

defmethod

(a,b):

print("run method")

return a+b

rt = method(1,2)

print(rt)

輸出如下:

before

run method

after

5

functools該模組結合之前,我們使用的裝飾器普通函式,就很容易理解了~~

比如@abstractmethod、@property、 @classmethod、 @staticmethod等 這裡就省略了

Python設計模式 裝飾器模式

基於3.5.2,如下 coding utf 8 裝飾器模式 class beverage name price 0.0 type beverage defgetprice self return self.price defsetprice self,price self.price price d...

Python設計模式 裝飾器模式

裝飾器模式,動態地給乙個物件新增一些額外的職責,就增加功能來說,裝飾器模式比生成子類更為靈活。示例 coding utf 8 裝飾器模式 class beverage name price 0.0 type beverage def getprice self return self.price d...

python裝飾器設計方法 裝飾器設計模式

本篇文章幫大家學習裝飾器設計模式,包含了裝飾器設計模式使用方法 操作技巧 例項演示和注意事項,有一定的學習價值,大家可以用來參考。裝飾器模式允許使用者在不改變其結構的情況下向現有物件新增新功能。這種型別的設計模式屬於結構模式,因為此模式充當現有類的包裝。這個模式建立了乙個裝飾器類,它封裝了原始類,並...