백엔드 개발 파이썬 튜토리얼 Python의 메서드에 참조 평등이 부족한 이유는 무엇입니까?

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

Oct 27, 2024 pm 03:53 PM

 Why Do Methods in Python Lack Reference Equality?

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

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

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

<code class="python">&gt;&gt;&gt; What.__dict__['meth']
&lt;function What.meth at 0x10a6f9c80&gt;
&gt;&gt;&gt; What.__dict__['meth'].__get__(What(), What)
&lt;bound method What.meth of &lt;__main__.What object at 0x10a6f7b10&gt;&gt;</code>
로그인 후 복사

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

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

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

<code class="python">&gt;&gt;&gt; What.meth == What.meth     # functions (or unbound methods in Python 2)
True
&gt;&gt;&gt; What().meth == What.meth   # bound method and function
False
&gt;&gt;&gt; What().meth == What().meth # bound methods with *different* instances
False
&gt;&gt;&gt; What().meth.__func__ == What().meth.__func__ # functions
True</code>
로그인 후 복사

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

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

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

뜨거운 기사 태그

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

HTML을 구문 분석하기 위해 아름다운 수프를 어떻게 사용합니까? HTML을 구문 분석하기 위해 아름다운 수프를 어떻게 사용합니까? Mar 10, 2025 pm 06:54 PM

HTML을 구문 분석하기 위해 아름다운 수프를 어떻게 사용합니까?

파이썬의 이미지 필터링 파이썬의 이미지 필터링 Mar 03, 2025 am 09:44 AM

파이썬의 이미지 필터링

Python을 사용하여 텍스트 파일의 ZIPF 배포를 찾는 방법 Python을 사용하여 텍스트 파일의 ZIPF 배포를 찾는 방법 Mar 05, 2025 am 09:58 AM

Python을 사용하여 텍스트 파일의 ZIPF 배포를 찾는 방법

Python을 사용하여 PDF 문서를 사용하는 방법 Python을 사용하여 PDF 문서를 사용하는 방법 Mar 02, 2025 am 09:54 AM

Python을 사용하여 PDF 문서를 사용하는 방법

Django 응용 프로그램에서 Redis를 사용하여 캐시하는 방법 Django 응용 프로그램에서 Redis를 사용하여 캐시하는 방법 Mar 02, 2025 am 10:10 AM

Django 응용 프로그램에서 Redis를 사용하여 캐시하는 방법

Tensorflow 또는 Pytorch로 딥 러닝을 수행하는 방법은 무엇입니까? Tensorflow 또는 Pytorch로 딥 러닝을 수행하는 방법은 무엇입니까? Mar 10, 2025 pm 06:52 PM

Tensorflow 또는 Pytorch로 딥 러닝을 수행하는 방법은 무엇입니까?

파이썬 객체의 직렬화 및 사제화 : 1 부 파이썬 객체의 직렬화 및 사제화 : 1 부 Mar 08, 2025 am 09:39 AM

파이썬 객체의 직렬화 및 사제화 : 1 부

파이썬에서 자신의 데이터 구조를 구현하는 방법 파이썬에서 자신의 데이터 구조를 구현하는 방법 Mar 03, 2025 am 09:28 AM

파이썬에서 자신의 데이터 구조를 구현하는 방법

See all articles