English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Python 기본 튜토리얼

Python 흐름 제어

Python 함수

Python 데이터 타입

Python 파일 작업

Python 객체와 클래스

Python 날짜와 시간

Python 고급 지식

Python 참조 매뉴얼

Python 다중 상속

이 문서에서는 Python의 다중 상속이 무엇인지 및 프로그램에서 그것을 사용하는 방법을 배울 것입니다. 또한, 다중 상속 및 메서드解析 순서도 배울 것입니다.

Python의 다중 상속

C ++와 같이클래스Python에서는 여러 기본 클래스에서 파생될 수 있습니다. 이를 다중 상속이라고 합니다.

다중 상속에서는 모든 기본 클래스의 기능이 파생 클래스에 상속됩니다. 다중 상속의 문법은 단일 상속과 유사합니다.상속.

class Base1):
    pass
class Base2):
    pass
class MultiDerived(Base1, Base2)
    pass

여기서는MultiDerived부모 클래스에서Base1Base2.

MultiDerived 클래스는 Base1와 Base2상속.

Python의 다중 상속

그리고, 파생 클래스도 상속할 수 있습니다. 이를 다중 상속이라고 합니다. Python에서는 어떤 깊이든 가능합니다.

다중 상속에서, 기본 클래스와 파생 클래스의 기능이 새로운 파생 클래스에 继承됩니다.

아래는 해당 시각화 효과를 가진 예제입니다.

class Base:
    pass
class Derived1(Base):
    pass
class Derived2(Derived1)
    pass

이곳에서Derived1에서Base파생된Derived2에서Derived1파생.

파이썬에서의 메서드解析 순서

Python의 모든 클래스는 이 클래스 object에서 파생됩니다. 이것은 Python에서 가장 기본적인 타입입니다.

따라서, 기술적으로 모든 다른 클래스(내장된 클래스나 사용자 정의 클래스)는 파생 클래스이며, 모든 객체는 object 클래스의 예제입니다.

# 출력: True
print(issubclass(list, object))
# 출력: True
print(isinstance(5.5,object))
# 출력: True
print(isinstance("Hello", object))

다중 상속 방식에서는, 현재 클래스에서 특정 속성을 먼저 검색합니다. 찾지 못하면, 깊이 우선, 왼쪽에서 오른쪽으로의 방식으로 부모 클래스에 접근하여 같은 클래스를 두 번 검색하지 않습니다.

그래서, 위의 예제에서 MultiDerived 클래스의 검색 순서는 [MultiDerived, Base]입니다.1,Base2,object]。이 순서는 MultiDerived 클래스의 선형화로도 알려져 있으며, 이 순서를 찾는 규칙 집합은 " 메서드解析 순서(MRO).

MRO는 로컬 우선순위 정렬을 방지하고 일관성을 제공해야 합니다. 이는 항상 부모 클래스보다 앞에 나타나야 하며, 여러 부모 클래스가 있을 경우, 기본 클래스의 튜플과 같은 순서를 가져야 합니다.

클래스의 MRO는 __mro__ 속성이나 mro() 메서드로 볼 수 있습니다. 전자는 튜플을 반환하며, 후자는 리스트를 반환합니다.

>>> MultiDerived.__mro__
(<class '__main__.MultiDerived'>,
 # <class '__main__.Base1'>,
 # <class '__main__.Base2'>,
 # <class 'object')>
>>> MultiDerived.mro()
[<class '__main__.MultiDerived'>,
 # <class '__main__.Base1'>,
 # <class '__main__.Base2'>,
 # <class 'object'>]

이는 조금 더 복잡한多重继承 예제와 그 시각화 및 MRO입니다.

class X: pass
class Y: pass
class Z: pass
class A(X,Y): pass
class B(Y,Z): pass
class M(B,A,Z): pass
# 출력:
# [<class '__main__.M'>, <class '__main__.B'>,
# <class '__main__.A'>, <class '__main__.X'>,
# <class '__main__.Y'>, <class '__main__.Z'>,
# <class 'object'>]
print(M.mro())

이 내용을 참조하여 더MRO에 대해 논의하다이해하고 계산 방식을 알아보세요.