클래스 필드를 클래스 메서드 데코레이터에 전달
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!