將類別欄位傳遞給類別方法裝飾器
當嘗試將類別欄位傳遞給類別方法上的裝飾器時,您可能會遇到錯誤提示該欄位不存在。出現這種情況是因為您試圖在類別定義時傳遞該字段,但該字段在該階段可能不可用。
解決方案 1:運行時檢查
要解決此問題,請考慮在運行時檢查該欄位。這可以透過修改裝飾器來攔截方法參數來實現,其中第一個參數將是實例。然後可以使用.:
<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()</code>
解決方案2:屬性名稱為字串
如果您希望避免在裝飾器中硬編碼屬性名稱來存取實例屬性,您可以將其作為字串傳遞:
<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>
以上是如何將類別欄位傳遞給類別方法裝飾器的詳細內容。更多資訊請關注PHP中文網其他相關文章!