오늘 공부한 것 정리 :
https://sogummi.tistory.com/37
https://sogummi.tistory.com/40
- Today I Learned
사실은 어제 새벽에 몇 시간정도 검색했던 것인데 super가 단순히 부모클래스의 메소드를 호출하는 것이 아니라
다중상속이나 다이아몬드 상속의 경우 중복상속 문제를 해결하기 위한 파이썬의 고급기능이라는 것을 알았다.
다중상속에서 super()함수를 올바르게 사용하려면 MRO라는 것이 중요하다.
MRO는 Method Resolution Order로 클래스가 상속관계를 가졌을 때, 메소드 호출에 대한 순서를 정해주는 것임
- 문제 :
class Unit:
def __init__(self):
super().__init__()
print("Unit 생성자")
class Flyable:
def __init__(self):
super().__init__()
print("Flyable 생성자")
class FlyableUnit(Unit, Flyable):
def __init__(self):
super().__init__() # Unit의 init메소트 호출
dropship = FlyableUnit()
print(FlyableUnit.__mro__)
이렇게 작성되었을 때 출력결과는
Flyable 생성자
Unit 생성자
이었다 하지만 mro를 출력해보니
(<class '__main__.FlyableUnit'>, <class '__main__.Unit'>, <class '__main__.Flyable'>, <class 'object'>)
FlyableUnit -> Unit -> Flyable 순서 인데 출력은 다르게 나오는 점이 헷갈렸다.
- 시도:
사실 super()가 부모클래스의 메소드를 호출하는 정도만 알아도 되긴 하지만 궁금한 것은 못참기 때문에 새벽까지 검색하다보니 다이아몬드 상속까지 가버렸었다.. 아무튼 아침에 일어나자마자 튜터님한테 가서 여쭤봤는데 중급기능이라 나중에 배우면 좋을거라고 약간의 전체적인 개념을 설명해주셨는데 나는 완전히 개념이 잡히지 않았었다.
- 해결?: 그래도 궁금한건 못참기 때문에 동기랑 40분 정도 더 고민해보았다.
class MotherUnit:
def __init__(self):
print("MotherUnit 생성자")
class Unit(MotherUnit):
def __init__(self):
print("Unit 생성자")
super().__init__()
class Flyable(MotherUnit):
def __init__(self):
print("Flyable 생성자")
super().__init__()
class FlyableUnit(Unit, Flyable):
def __init__(self):
print("FlyableUnit 생성자")
super().__init__() # Unit의 init메소트 호출
dropship = FlyableUnit()
print(FlyableUnit.__mro__)
다른 예시도 찾아보면서 만약 저렇게 나오는 게 지금 Unit과 Flyable이 상속받고 있는 부모가 없어서 그런걸까 하고 부모클래스를 하나 더 만들어서 상속받게 해보았고 확실히 결과를 보기위해서 print문도 다 넣어주었다. 그런데 자세히보니 print를 super()함수 밑에 놔둔걸 발견하고 super함수 실행전에 print문을 넣어주니
FlyableUnit 생성자
Unit 생성자
Flyable 생성자
MotherUnit 생성자
(<class '__main__.FlyableUnit'>, <class '__main__.Unit'>, <class '__main__.Flyable'>, <class '__main__.MotherUnit'>, <class 'object'>)
mro순서대로 잘 나오는 것을 확인했다. 그래서 아까 코드에도 똑같이 print를 고치고 실행해보았다
class Unit:
def __init__(self):
print("Unit 생성자")
super().__init__()
class Flyable:
def __init__(self):
print("Flyable 생성자")
super().__init__()
class FlyableUnit(Unit, Flyable):
def __init__(self):
print("FlyableUnit 생성자")
super().__init__() # Unit의 init메소트 호출
dropship = FlyableUnit()
print(FlyableUnit.__mro__)
FlyableUnit 생성자
Unit 생성자
Flyable 생성자
로 MRO순서에 맞게 잘 출력됨을 알 수 있었다 ㅎㅎ
- 알게된 점: super 함수가 중복상속을 방지해주는 기능이 있다는 것을 알게되었고. 다이아몬드 상속이라는 것도 알게되었다. 그리고 상속과 다중상속의 개념을 한층 더 알게된 것 같다.
'내일배움캠프 > 내일배움캠프 TIL' 카테고리의 다른 글
내일배움캠프 AI 5기 TIL 11일차 (2) | 2023.03.27 |
---|---|
내일배움캠프 AI 5기 TIL 10일차 (4) | 2023.03.24 |
내일배움캠프 AI 5기 TIL 8일차 (3) | 2023.03.22 |
내일배움캠프 AI 5기 TIL 7일차 (1) | 2023.03.21 |
내일배움캠프 AI 5기 TIL 6일차 (7) | 2023.03.21 |