Python 메소드가 바인딩되었는지 여부를 어떻게 확인합니까?
-
09-06-2019 - |
문제
메소드에 대한 참조가 주어지면 메소드가 객체에 바인딩되어 있는지 여부를 확인하는 방법이 있습니까?바인딩된 인스턴스에도 액세스할 수 있나요?
해결책
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만 해당)