백엔드 개발 파이썬 튜토리얼 Python의 isinstance 상속 관계 오버로드 문제에 대한 간략한 논의

Python의 isinstance 상속 관계 오버로드 문제에 대한 간략한 논의

May 04, 2018 pm 02:21 PM
python 상속하다

이 글은 주로 Python의 isinstance 상속 관계 오버로드 문제를 소개합니다. 이제 특정 참조 값을 가지고 있습니다. 필요한 친구들이 참조할 수 있습니다.

상속 관계를 판단하세요

생성 메소드 isinstance(object, classinfo)는 객체가 특정 클래스의 인스턴스인지 여부를 확인할 수 있습니다. 이 관계는 직접적이거나 간접적이거나 추상적일 수 있습니다.

인스턴스 검사는 오버로드가 허용됩니다. customizing-instance-and-subclass-checks 문서를 참조하세요. PEP 3119의 설명에 따르면:

여기서 제안된 기본 메커니즘은 내장 함수 isinstance() 및 issubclass()의 오버로드를 허용하는 것입니다. 오버로딩은 다음과 같이 작동합니다. isinstance(x, C) 호출은 먼저 여부를 확인합니다. C. __instancecheck__가 존재하며, 그렇다면 일반 구현 대신 C.__instancecheck__(x)를 호출합니다.

이 의미는 감지를 위해 isinstance(x, C)를 호출할 때 먼저 C가 존재하는지 확인한다는 것입니다. __instancecheck__, 존재하는 경우 C.__instancecheck__(x)를 호출하고 반환된 결과는 인스턴스 감지 결과이며 기본 판단 방법은 없습니다.

이 방법은 덕 타이핑을 확인하는 데 도움이 되며 코드로 테스트했습니다.

class Sizeable(object):
  def __instancecheck__(cls, instance):
    print("__instancecheck__ call")
    return hasattr(instance, "__len__")

class B(object):
  pass

b = B()
print(isinstance(b, Sizeable)) # output:False
로그인 후 복사

False만 인쇄되고 __instancecheck__는 호출되지 않습니다. 무슨 일이야?

실행 중인 __instancecheck__

문서가 명확하게 작성되지 않은 것을 볼 수 있습니다. 문제를 찾기 위해 isinstance 소스 코드에서 추적을 시작합니다.

[abstract.c]
int
PyObject_IsInstance(PyObject *inst, PyObject *cls)
{
  _Py_IDENTIFIER(__instancecheck__);
  PyObject *checker;

  /* Quick test for an exact match */
  if (Py_TYPE(inst) == (PyTypeObject *)cls)
    return 1;
  ....
}
로그인 후 복사

Py_TYPE(inst) == (PyTypeObject *)cls 이것은 type(inst) is cls와 동일한 빠른 일치 방법입니다. 이 빠른 방법이 성공적으로 일치하면 __instancecheck__를 확인하지 않습니다. 따라서 C.__instancecheck__ 존재에 대한 문서의 우선순위 확인이 잘못되었습니다. 계속해서 소스 코드를 살펴보세요:

  /* We know what type's __instancecheck__ does. */
  if (PyType_CheckExact(cls)) {
    return recursive_isinstance(inst, cls);
  }
로그인 후 복사

Expand 매크로 PyType_CheckExact:

[object.h]
#define PyType_CheckExact(op) (Py_TYPE(op) == &PyType_Type)
로그인 후 복사

즉, cls는 유형에서 직접 구성된 클래스이고, 그러면 판단 언어가 설정됩니다. 클래스 선언에 명시된 메타클래스를 제외하고는 기본적으로 타입별로 직접 구성된다. 테스트 코드를 통해 판단이 확립되었음을 알고 recursive_isinstance를 입력합니다. 하지만 이 함수에서 __instancecheck__에 대한 코드는 찾지 못했습니다. recursive_isinstance의 판단 논리는 대략 다음과 같습니다.

def recursive_isinstance(inst, cls):
  return pyType_IsSubtype(inst, cls)

def pyType_IsSubtype(a, b):
  for mro in a.__mro__:
    if mro is b:
      return True
  return False
로그인 후 복사

는 __mro__ 상속 순서로 판단됩니다. PyObject_IsInstance 함수로 돌아가서 살펴보세요:

if (PyTuple_Check(cls)) {
  ...
}
로그인 후 복사

instance(x, C)의 두 번째 매개변수가 튜플일 때, 처리 방법은 PyObject_IsInstance(inst, item)를 재귀적으로 호출하는 것입니다. 계속 읽기:

checker = _PyObject_LookupSpecial(cls, &PyId___instancecheck__);
if (checker != NULL) {
  res = PyObject_CallFunctionObjArgs(checker, inst, NULL);
  ok = PyObject_IsTrue(res);
  return ok;
}
로그인 후 복사

분명히 여기가 __instancecheck__를 얻는 곳입니다. 이 지점까지 확인 프로세스를 수행하려면 정의된 클래스에서 Metaclass를 지정해야 합니다. 남은 것은 _PyObject_LookupSpecial을 추적하는 것입니다:

[typeobject.c]
PyObject *
_PyObject_LookupSpecial(PyObject *self, _Py_Identifier *attrid)
{
  PyObject *res;

  res = _PyType_LookupId(Py_TYPE(self), attrid);
  // 有回调的话处理回调
  // ...
  return res;
}
로그인 후 복사

는 Py_TYPE(self)를 취합니다. 이는 __instancecheck__가 지정된 메타클래스에 정의되어야 함을 의미합니다.

요약

지금까지 isinstance(x, C) 동작을 오버로드하기 위한 조건을 요약했습니다.

  1. x 객체는 C에서 직접 인스턴스화할 수 없습니다.

  2. C 클래스는 메타클래스를 지정합니다. __instancecheck__는 지정된 메타클래스 클래스에 정의되어 있습니다.

  3. 테스트 코드:

class MetaSizeable(type):
  def __instancecheck__(cls, instance):
    print("__instancecheck__ call")
    return hasattr(instance, "__len__")

class Sizeable(metaclass=MetaSizeable):
  pass

class B(object):
  pass

b = B()
print(isinstance(b, Sizeable)) # output: False
print(isinstance([], Sizeable)) # output: True
로그인 후 복사

문서가 약간 오래되었을 수 있습니다. 본 테스트 환경은 Python3.6입니다.

관련 권장 사항:


Python 2.7 pandas

에서 read_excel에 대한 자세한 설명

위 내용은 Python의 isinstance 상속 관계 오버로드 문제에 대한 간략한 논의의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

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

SublimeText3 중국어 버전

SublimeText3 중국어 버전

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

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

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

XML을 PDF로 변환 할 수있는 모바일 앱이 있습니까? XML을 PDF로 변환 할 수있는 모바일 앱이 있습니까? Apr 02, 2025 pm 08:54 PM

XML을 PDF로 직접 변환하는 응용 프로그램은 근본적으로 다른 두 형식이므로 찾을 수 없습니다. XML은 데이터를 저장하는 데 사용되는 반면 PDF는 문서를 표시하는 데 사용됩니다. 변환을 완료하려면 Python 및 ReportLab과 같은 프로그래밍 언어 및 라이브러리를 사용하여 XML 데이터를 구문 분석하고 PDF 문서를 생성 할 수 있습니다.

XML 형식을 여는 방법 XML 형식을 여는 방법 Apr 02, 2025 pm 09:00 PM

대부분의 텍스트 편집기를 사용하여 XML 파일을여십시오. 보다 직관적 인 트리 디스플레이가 필요한 경우 Oxygen XML 편집기 또는 XMLSPy와 같은 XML 편집기를 사용할 수 있습니다. 프로그램에서 XML 데이터를 처리하는 경우 프로그래밍 언어 (예 : Python) 및 XML 라이브러 (예 : XML.etree.elementtree)를 사용하여 구문 분석해야합니다.

protobuf 및 연결 문자열 상수에서 열거 유형을 정의하는 방법은 무엇입니까? protobuf 및 연결 문자열 상수에서 열거 유형을 정의하는 방법은 무엇입니까? Apr 02, 2025 pm 03:36 PM

protobuf에서 문자열 상수 열거를 정의하는 문제 protobuf를 사용할 때 종종 열거 유형을 문자열 상수와 연관시켜야하는 상황이 발생합니다 ...

XML에서 댓글 내용을 수정하는 방법 XML에서 댓글 내용을 수정하는 방법 Apr 02, 2025 pm 06:15 PM

작은 XML 파일의 경우 주석 내용을 텍스트 편집기로 직접 교체 할 수 있습니다. 큰 파일의 경우 XML 파서를 사용하여 효율성과 정확성을 보장하기 위해 수정하는 것이 좋습니다. XML 주석을 삭제할 때주의를 기울이면 주석을 유지하면 일반적으로 코드 이해 및 유지 관리에 도움이됩니다. 고급 팁은 XML 파서를 사용하여 댓글을 수정하기위한 파이썬 샘플 코드를 제공하지만 사용 된 XML 라이브러리에 따라 특정 구현을 조정해야합니다. XML 파일을 수정할 때 인코딩 문제에주의하십시오. UTF-8 인코딩을 사용하고 인코딩 형식을 지정하는 것이 좋습니다.

XML 수정에 프로그래밍이 필요합니까? XML 수정에 프로그래밍이 필요합니까? Apr 02, 2025 pm 06:51 PM

XML 컨텐츠를 수정하려면 프로그래밍이 필요합니다. 대상 노드를 추가, 삭제, 수정 및 확인하려면 정확한 찾기가 필요하기 때문입니다. 프로그래밍 언어에는 XML을 처리하기위한 해당 라이브러리가 있으며 운영 데이터베이스와 같이 안전하고 효율적이며 제어 가능한 작업을 수행 할 수있는 API를 제공합니다.

권장 XML 서식 도구 권장 XML 서식 도구 Apr 02, 2025 pm 09:03 PM

XML 서식 도구는 규칙에 따라 코드를 입력하여 가독성과 이해를 향상시킬 수 있습니다. 도구를 선택할 때는 사용자 정의 기능, 특수 상황 처리, 성능 및 사용 편의성에주의하십시오. 일반적으로 사용되는 도구 유형에는 온라인 도구, IDE 플러그인 및 명령 줄 도구가 포함됩니다.

휴대 전화 용 무료 XML에서 PDF 도구가 있습니까? 휴대 전화 용 무료 XML에서 PDF 도구가 있습니까? Apr 02, 2025 pm 09:12 PM

모바일에는 간단하고 직접 무료 XML에서 PDF 툴이 없습니다. 필요한 데이터 시각화 프로세스에는 복잡한 데이터 이해 및 렌더링이 포함되며 시장에있는 소위 "무료"도구의 대부분은 경험이 좋지 않습니다. 컴퓨터 측 도구를 사용하거나 클라우드 서비스를 사용하거나보다 신뢰할 수있는 전환 효과를 얻기 위해 앱을 개발하는 것이 좋습니다.

휴대폰에서 XML을 PDF로 변환 할 때 변환 속도가 빠르나요? 휴대폰에서 XML을 PDF로 변환 할 때 변환 속도가 빠르나요? Apr 02, 2025 pm 10:09 PM

모바일 XML에서 PDF의 속도는 다음 요인에 따라 다릅니다. XML 구조의 복잡성. 모바일 하드웨어 구성 변환 방법 (라이브러리, 알고리즘) 코드 품질 최적화 방법 (효율적인 라이브러리 선택, 알고리즘 최적화, 캐시 데이터 및 다중 스레딩 사용). 전반적으로 절대적인 답변은 없으며 특정 상황에 따라 최적화해야합니다.

See all articles