문제

메소드에 대한 참조가 주어지면 메소드가 객체에 바인딩되어 있는지 여부를 확인하는 방법이 있습니까?바인딩된 인스턴스에도 액세스할 수 있나요?

도움이 되었습니까?

해결책

def isbound(method):
    return method.im_self is not None

def instance(bounded_method):
    return bounded_method.im_self

사용자 정의 방법:

클래스에서 사용자 정의 된 기능 객체를 검색하여 사용자 정의 메소드 객체가 생성되는 경우 im_self 속성은 None 그리고 메소드 객체는 결합되지 않은 것으로 알려져 있습니다.인스턴스 중 하나를 통해 클래스에서 사용자 정의 기능 객체를 검색하여 생성되는 경우 im_self 속성은 인스턴스이며 메소드 객체는 바인딩된다고합니다.두 경우 모두 새로운 방법의 im_class 속성은 검색이 이루어지는 클래스이며 im_func 속성은 원래 함수 객체입니다.

파이썬에서 2.6 및 3.0:

인스턴스 메소드 객체는 메소드를 포함하는 객체 및 함수에 대한 새로운 속성을 가지고 있습니다.새로운 동의어 im_self ~이다 __self__, 그리고 im_func다음과 같이도 사용 가능합니다. __func__.이전 이름은 여전히 ​​Python 2.6에서 지원되지만 3.0으로 사라집니다.

다른 팁

파이썬 3에서는 __self__ 속성은 오직 바인딩된 메서드에 설정합니다.으로 설정되어 있지 않습니다. None 일반 함수(또는 Python 3의 일반 함수인 바인딩되지 않은 메서드)에서.

다음과 같이 사용하십시오.

def is_bound(m):
    return hasattr(m, '__self__')

선택한 답변은 거의 모든 경우에 유효합니다.그러나 선택한 답변을 사용하여 데코레이터에 메서드가 바인딩되어 있는지 확인하면 확인이 실패합니다.다음 예제 데코레이터 및 메서드를 고려해보세요.

def my_decorator(*decorator_args, **decorator_kwargs):
    def decorate(f):
        print(hasattr(f, '__self__'))
        @wraps(f)
        def wrap(*args, **kwargs):
            return f(*args, **kwargs)
        return wrap
    return decorate

class test_class(object):
    @my_decorator()
    def test_method(self, *some_params):
        pass

그만큼 print 데코레이터의 명령문이 인쇄됩니다 False.이 경우 인수 이름을 사용하여 함수 매개변수를 확인하고 이름이 지정된 매개변수를 찾는 것 외에는 다른 방법을 찾을 수 없습니다. self.이것은 또한 ~ 아니다 메소드의 첫 번째 인수에 이름을 지정하지 않아도 되므로 완벽하게 작동함을 보장합니다. self 다른 이름을 가질 수 있습니다.

import inspect

def is_bounded(function):
    params = inspect.signature(function).parameters
    return params.get('self', None) is not None

im_self 기인하다 (파이썬 2만 해당)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top