>백엔드 개발 >파이썬 튜토리얼 >Python 메서드가 함수와 비교하여 참조 평등에서 다르게 동작하는 이유는 무엇입니까?

Python 메서드가 함수와 비교하여 참조 평등에서 다르게 동작하는 이유는 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-10-30 07:32:02502검색

 Why Do Python Methods Behave Differently in Reference Equality Compared to Functions?

수수께끼 공개: Python의 메서드 참조 평등

Python 프로그래밍 영역에서 참조 평등의 개념은 매력적이고 동시에 매력적일 수 있습니다. 난처한. 놀랍게도 메소드는 일반 함수와는 달리 참조 동등성에 있어서 독특한 동작을 나타냅니다.

왜 이렇게 눈에 띄는 차이가 있을까요? 대답은 메소드가 생성되고 호출되는 방식의 특성에 있습니다. 전역 범위에서 독립적으로 존재하는 함수와 달리 메서드는 액세스될 때마다 동적으로 생성됩니다. 이는 Python에서 설명자로서 함수의 역할에서 비롯됩니다. 함수의 .__get__ 메서드가 호출되면 메서드 개체가 반환됩니다.

다음 예를 고려하세요.

<code class="python">class What:
    def meth(self):
        pass

print(What.meth is What.meth)  # This is False in Python 2
print(inst.meth is inst.meth)  # False</code>

위 코드는 두 시나리오 모두에 대해 False를 인쇄합니다. 이는 What.meth에 액세스할 때마다 새로운 메서드 개체가 생성되기 때문입니다. 따라서 이러한 메소드 객체는 참조 동일하다고 간주될 수 없습니다.

반면 일반 함수는 전역 엔터티이므로 func가 호출되면 항상 동일한 객체를 참조합니다. 이는 func의 실제 결과가 func라는 것을 설명합니다.

그러나 Python 3.8에서는 상당한 개선이 이루어졌습니다. 이제 .__self__ 및 .__func__ 속성이 동일한 객체인 경우 두 메서드는 동일한 것으로 간주됩니다. 즉, 두 메서드가 동일한 함수를 래핑하고 동일한 인스턴스에 바인딩된 경우 ==를 사용하여 True를 비교합니다.

3.8 이전 Python 버전의 경우 메서드 == 동작이 일관되지 않았습니다. Python 메서드와 한 유형의 C 메서드는 self가 동일한지 비교하고, 다른 유형의 C 메서드는 self를 동일성으로 비교했습니다.

두 메서드가 동일한지 테스트하려면 기본 함수인 경우 해당 func 속성을 ​​비교하는 것이 좋습니다.

<code class="python">print(What.meth == What.meth)     # functions (or unbound methods in Python 2)
print(What().meth == What().meth) # bound methods with *different* instances
print(What().meth.__func__ == What().meth.__func__) # functions</code>

위 내용은 Python 메서드가 함수와 비교하여 참조 평등에서 다르게 동작하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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