>  기사  >  백엔드 개발  >  Python의 메서드에 참조 평등이 부족한 이유는 무엇입니까?

Python의 메서드에 참조 평등이 부족한 이유는 무엇입니까?

DDD
DDD원래의
2024-10-27 15:53:02392검색

 Why Do Methods in Python Lack Reference Equality?

Python의 메서드 참조 평등: 미스터리 발견

일반 함수에서 상속받은 것처럼 보이는 메서드에 참조의 미덕이 부족한 이유는 무엇입니까? 평등? 이 당혹스러운 현상은 많은 Python 프로그래머들을 당황하게 했습니다. 이러한 차이의 원인을 이해하기 위해 기본 메커니즘을 자세히 살펴보겠습니다.

프로그램 전체에서 개체 ID를 유지하는 일반 함수와 달리 메서드 개체는 액세스 시 동적으로 생성됩니다. 이러한 일시적인 특성은 .__get__ 메서드가 호출될 때 메서드 개체를 생성하는 설명자에 대한 종속성에서 비롯됩니다. 코드 조각은 이 동작을 적절하게 보여줍니다.

<code class="python">>>> What.__dict__['meth']
<function What.meth at 0x10a6f9c80>
>>> What.__dict__['meth'].__get__(What(), What)
<bound method What.meth of <__main__.What object at 0x10a6f7b10>></code>

Python 3.8부터 메서드에 대한 동등성 테스트가 일관되고 예측 가능해졌습니다. .__self__(바인딩된 인스턴스)와 .__func__(기본 함수) 속성이 모두 동일한 객체인 경우 두 메서드는 동일한 것으로 간주됩니다.

그러나 이러한 일관된 동작은 최근 추가된 것입니다. Python 3.8 이전에는 구현 세부 사항에 따라 메서드 동일성이 다양했습니다. Python 메서드와 특정 C 메서드 유형의 경우 self가 동일한지 비교되었고, 다른 C 메서드 유형의 경우 self가 동일하게 비교되었습니다. 이 불일치는 결국 Python 문제 1617161에서 해결되었습니다.

일관성을 보장하려면 func 속성을 ​​사용하여 메서드 ID를 확인하는 것이 좋습니다.

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

요약하자면, 메소드 객체의 일시적인 현상과 메소드 동등성의 역사적 불일치로 인해 메소드에 대한 참조 동등성이 부재하게 되었습니다. 그러나 Python 3.8에서는 더욱 일관되고 예측 가능한 접근 방식을 도입하여 프로그래머가 더 큰 확신을 갖고 메서드 평등에 대해 추론할 수 있게 되었습니다.

위 내용은 Python의 메서드에 참조 평등이 부족한 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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