Python 다 중 계승 방법 해석 실행 순서 실례 분석
다 중 계승 을 실현 하 는 모든 언어 는 잠재 적 인 명명 충돌 을 처리 해 야 한다.이런 충돌 은 관련 이 없 는 조상 류 가 동명 의 방법 으로 인해 발생 한다.
class A:
def say(self):
print("A Hello:", self)
class B(A):
def eat(self):
print("B Eating:", self)
class C(A):
def eat(self):
print("C Eating:", self)
class D(B, C):
def say(self):
super().say()
print("D Hello:", self)
def dinner(self):
self.say()
super().say()
self.eat()
super().eat()
C.eat(self)
여기 B 와 C 는 모두 eat 방법 을 실현 했다.D 의 인 스 턴 스 에서 d.eat()방법 을 호출 하면 어떤 eat 방법 을 실행 합 니까?
>>> d = D()
>>> d.eat()
B Eating: <__main__.D object at 0x7fb90c627f60>
>>> C.eat(d)
C Eating: <__main__.D object at 0x7fb90c627f60>
초 클래스 의 방법 은 모두 직접 호출 할 수 있 습 니 다.이 때 인 스 턴 스 를 명시 적 매개 변수 로 전송 해 야 합 니 다.파 이 썬 은 d.eat()가 호출 하 는 방법 을 구분 할 수 있 습 니 다.파 이 썬 이 특정한 순서에 따라 계승 도 를 옮 겨 다 니 기 때 문 입 니 다.이 순 서 는 방법 해석 순서(Method Resolution Order,MRO)라 고 합 니 다.클래스 는 모두 라 는 이름 이 있 습 니 다.mro__ 의 속성,그 값 은 하나의 원 그룹 입 니 다.방법 해석 순서에 따라 각 초 류 를 표시 합 니 다.현재 클래스 에서 object 류 까지 계속 위로 올 라 갑 니 다.D 류 의mro__ 속성 은 다음 과 같 습 니 다:
>>> D.__mro__
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class 'object'>)
>>> d = D()
>>> d.dinner()
A Hello: <__main__.D object at 0x7fb90bd7eb70>
D Hello: <__main__.D object at 0x7fb90bd7eb70>
A Hello: <__main__.D object at 0x7fb90bd7eb70>
B Eating: <__main__.D object at 0x7fb90bd7eb70>
B Eating: <__main__.D object at 0x7fb90bd7eb70>
C Eating: <__main__.D object at 0x7fb90bd7eb70>
첫 번 째self.say()
,A 류 를 실행 하 는say()
자신의 두 번 째 줄 정 보 를 인쇄 합 니 다.두 번 째
super().say()
,A 류 를 운행 하 는say()
세 번 째self.eat()
,__mro__
에 따 르 면 B 류 가 실현 하 는 eat 방법 을 찾 았 다.네 번 째
super().eat()
,__mro__
에 따 르 면 B 류 가 실현 하 는 eat 방법 을 찾 았 다.다섯 번 째
C.eat(self)
mro 를 무시 하고 C 류 가 실현 하 는 eat 방법 을 찾 았 습 니 다.더 많은 파 이 썬 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있다.
본 논문 에서 말 한 것 이 여러분 의 Python 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.