python的裝飾器是靜態(tài)的同仆,也就是說你使用的裝飾器一定是定義好的對象倚舀。在某些特殊的情況下,需要讓動(dòng)態(tài)使用裝飾器谷羞。
警告
不要隨便用這個(gè)辦法帝火,一點(diǎn)都不優(yōu)雅,能夠使用其他的方法規(guī)避動(dòng)態(tài)調(diào)用裝飾器就不要這么寫湃缎。
需求
裝飾器是類的一個(gè)屬性犀填,初始化時(shí)傳入一個(gè)特定的對象。某個(gè)類方法需要被這個(gè)特定實(shí)例裝飾才能生效嗓违。
我的問題情景
類需要使用一個(gè)Flask實(shí)例初始化九巡,類定義了一些列路由。這些路由需要被綁定在Flask實(shí)例上蹂季。
一個(gè)方法是使用add_url_rule()
添加視圖函數(shù)冕广。但是這樣做沒添加一個(gè)視圖函數(shù)就會(huì)多寫一條add_url_rule()
,并不是很優(yōu)雅偿洁。比較優(yōu)雅的方式是寫一個(gè)dict撒汉,里面定義路由和視圖函數(shù),然后遍歷dict完成添加父能。
思路
動(dòng)態(tài)裝飾器的問題無非是裝飾器不能使用self訪問類神凑,那用嵌套函數(shù)不就可以訪問了嗎,就是丑了一點(diǎn)而已
class decorator_test:
def __init__(self):
self.test()
self.wrapped_func()
def wrapper(self, func):
def wrapped(*args, **kwargs):
print('wrapped')
return func(*args, **kwargs)
return wrapped
def test(self):
@self.wrapper
def wrapped_func():
print('wrapped_func')
self.__setattr__('wrapped_func', wrapped_func)
看看就好