>  기사  >  백엔드 개발  >  인스턴스 속성을 Python의 클래스 메서드 데코레이터에 인수로 전달할 수 있습니까?

인스턴스 속성을 Python의 클래스 메서드 데코레이터에 인수로 전달할 수 있습니까?

Barbara Streisand
Barbara Streisand원래의
2024-10-18 12:02:36782검색

Can Instance Attributes be Passed as Arguments to Class Method Decorators in Python?

클래스 필드를 클래스 메서드 데코레이터에 전달

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.