Python의 메서드 평등: 참조 불평등 수수께끼 풀기
Python에서 메서드와 함수는 묘한 차이점을 나타냅니다. 반면 함수는 참조 평등을 나타냅니다. , 메소드는 그렇지 않습니다. 특히 메서드를 비교하기 위해 is 연산자를 사용할 때 예상치 못한 버그가 발생할 수 있습니다.
참조 평등이 메서드를 피하는 이유
정적 엔터티인 함수와 달리 메서드는 객체는 액세스될 때마다 동적으로 생성됩니다. 이는 메소드가 설명자 역할을 하여 .__get__ 메소드가 호출될 때 새 메소드 객체를 반환하기 때문입니다. 예를 들어, 제공된 예제에서
class What: def meth(self): pass
What.meth 할당은 나중에 inst.meth가 호출될 때 생성되는 바인딩된 메서드 개체와 다른 함수 개체를 반환합니다. 이는 What.meth가 What.meth가 False로 평가되는 이유를 설명합니다.
Is Equality in Python 3.8
Python 버전 3.8 이상에서는 대체 접근 방식을 사용할 수 있습니다. 동등성 테스트를 위해 ==를 사용합니다. .__self__ 및 .__func__ 속성이 동일한 객체인 경우 두 메서드는 동일한 것으로 간주됩니다. 이는 두 메서드가 동일한 함수를 래핑하고 동일한 인스턴스에 바인딩되어 있음을 나타냅니다.
함수 __및 바인딩 해제된 메서드
Python 버전에 관계없이 함수와 바인딩되지 않은 메서드(Python 2)는 is 연산자를 사용하여 비교할 수 있습니다. 둘 다 동일한 기본 함수 참조를 나타내기 때문입니다.
기본 함수 테스트
두 메서드가 동일한 기본 함수를 나타내는지 확인해야 하는 경우 .__func__ 속성을 비교할 수 있습니다.
if What().meth.__func__ == What().meth.__func__: print("Methods represent the same function")
이 접근 방식은 바인딩 상태나 Python 버전에 관계없이 메서드와 함수에 대해 일관되고 안정적인 동등성 검사를 제공합니다.
위 내용은 `is`가 Python에서 메서드를 비교하는 데 실패하지만 함수에서는 작동하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!