>  기사  >  백엔드 개발  >  `is`가 Python에서 메서드를 비교하는 데 실패하지만 함수에서는 작동하는 이유는 무엇입니까?

`is`가 Python에서 메서드를 비교하는 데 실패하지만 함수에서는 작동하는 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-02 18:35:03499검색

  Why Does `is` Fail to Compare Methods in Python, But Works for Functions?

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

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