Python - Inheritance(상속), MRO
2 minute read
상속(Inheritance)
- 코드 중복을 최소화하기 위해서 사용
- 파이썬 클래스의 최상위 클래스인 object 를 상속
- 클래스 간에 상속관계에 놓이면, 부모/자식 관계 성립
- 자식 클래스는 부모 클래스의 모든 내역을 상속
- 다중상속 지원
위 코드를 상속을 통해 중복을 제거합니다.
class Person(object):
def __init__(self, name):
self.name = name
def run(self):
print('뜁니다.')
def eat(self, food):
print('{}를 먹습니다.'.format(food))
def sleep(self):
print('잠을 잡니다.')
class Hulk(Person):
def angry(self):
print('분노를 합니다.')
class Spiderman(Person):
def spider_web(self):
print('거미줄을 쏩니다.')
class Ironman(Person):
def laser(self):
print('레이져를 쏩니다.')
MRO(Method Resolution Order)
- 파이썬의 클래스 탐색순서는 MRO를 따릅니다.
- Class.mro 를 통해 확인 가능
- MRO가 꼬이도록 클래스를 정의 ㅋ할 수는 없습니다.
- TypeError: Cannot create a consistent method resolution order(MRO)
>>> class A: pass
...
>>> A.mro()
[<class '__main__.A'>, <class 'object'>]
>>> class B(A): pass
...
>>> B.mro()
[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
>>> class C(A): pass
...
>>> C.mro()
[<class '__main__.C'>, <class '__main__.A'>, <class 'object'>]
>>> class D(B,C): pass
...
>>> D.mro()
[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]
>>> class E(C,B): pass
...
>>> E.mro()
[<class '__main__.E'>, <class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
>>> class F(D,E): pass # 정의 불가!!
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Cannot create a consistent method resolution
order (MRO) for bases C, B
MRO를 정확히 이해하고 있어야 다중상속을 이용하는 어떻게 이루어지는지 명확히 알 수 있습니다. (django의 CBV를 이해하기 위해 필수)
부모의 함수 호출
- 내장함수
super
를 통해 부모의 함수 호출 - D의 mro()순서는 D > B > C > A
- D().fn()의 실행결과로서 A, C, B, D가 출력
- super 호출 시에 MRO에 기반하여 호출
>>> class A:
... def fn(self):
... print('A')
...
>>> class B(A):
... def fn(self):
... super().fn()
... print('B')
...
>>> class C(A):
... def fn(self):
... super().fn()
... print('C')
...
>>> class D(B, C):
... def fn(self):
... super().fn()
... print('D')
>>> A().fn()
A
>>> B().fn()
A
B
>>> C().fn()
A
C
>>> D().fn()
A # A는 B와 C 모두의 부모이므로 B,C보다 앞서면 안된다.
C
B # B 다음에 B의 직계부모 A가 나오면 C보다 앞서므로 조건이 충족되지 않는다.
D
I feedback.
Let me know what you think of this article in the comment section below!
Let me know what you think of this article in the comment section below!