將類別欄位傳遞給類別方法裝飾器
在Python 中,可以使用附加參數的裝飾器來裝飾類別方法。但是,當嘗試將實例屬性作為參數傳遞給這些裝飾器時,會出現問題。
考慮以下範例:
<code class="python">class Client(object): def __init__(self, url): self.url = url @check_authorization("some_attr", self.url) def get(self): do_work()</code>
目的是將 self.url 屬性傳遞給 check_authorization 裝飾器。但是,Python 會引發錯誤,表示 self 在類別定義範圍內不存在。
解決方案
要解決此問題,可以將屬性檢查推遲到運行時通過攔截裝飾器中的方法參數。包裝函數的第一個參數將是實例,允許存取實例屬性。
<code class="python">def check_authorization(f): def wrapper(*args): print(args[0].url) return f(*args) return wrapper class Client(object): def __init__(self, url): self.url = url @check_authorization def get(self): print('get') Client('http://www.google.com').get() # Output: http://www.google.com # get</code>
替代方法
或者,可以透過傳遞動態存取屬性將屬性名稱作為裝飾器的字串。這消除了對特定屬性名稱進行硬編碼的需要。
<code class="python">def check_authorization(attribute): def _check_authorization(f): def wrapper(self, *args): print(getattr(self, attribute)) return f(self, *args) return wrapper return _check_authorization</code>
以上是實例屬性可以作為參數傳遞給 Python 中的類別方法裝飾器嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!