상속
: Inheritance
기존 클래스의 속성과 메서드를 물려받아 새로운 하위 클래스를 생성하는 것
코드의 재사용, 계층 구조 형성, 유지 보수의 용이성을 위해 사용
계층구조 변경
자식 class에서 정의된 함수를 사용하면 그대로 사용
만약, 그 class에 함수가 없으면 상속되어있는 부모 계층에 가서 그 함수를 확인함
super()
부모 클래스 객체를 반환하는 내장 함수
class Person:
def __init__(self, name, age, number, email):
self.name = name
self.age = age
self.number = number
self.email = email
class Student(Person):
def __init__(self, name, age, number, email, student_id):
self.name = name
self.age = age
self.number = number
self.email = email
self.student_id = student_id
부모 클래스와 자식 클래스가 같은 변수를 사용할 때 코드의 반복을 줄이기 위해 사용
class Student(Person):
def __init__(self,name,age,number,email,student_id):
super().__init__(name, age, number, email)
self.student_id = student_id
이렇게 super()을 사용해 부모클래스를 불러와 init 메서드를 호출함
이 때도 인자 호출은 해야함
부모class 이름 대신에 super()을 쓰는 이유
부모 class의 이름이 바뀌면 자식 class에서도 다 바꾸어줘야함
다중 상속에서 MRO를 기반으로 상속하는 모든 부모 클래스 중 다음에 호출될 메서드를 결정하여 자동 호출
다중 상속
둘 이상의 상위 클래스로부터 상속받음
상속받은 모든 클래스의 요소를 활용 가능함
중복된 속성이나 메서드가 있을 때 상속 순서에 의해 결정
다이아몬드 문제
두 클래스 B와 C가 A에 상속되고, 클래스 D가 B와 C 모두에서 상속이 될 때
B와 C에서 재정의한 메서드를 D가 재정의 하지 않았다면
어떤 버전을 상속하는지에 대한 문제
상속 속성의 검색 : 깊이 우선, 왼쪽에서 오른쪽
class FirstChild(Dad, Mom):
Person ->(Dad, Mom) -> FirstChild 식으로 상속이 되어있다면
속성을 FirstChild에서 찾아보고 없으면 Dad , Mom 순서대로 찾아보고 없으면 Person에서 찾음
MRO
:메서드 결정 순서
기존의 인스턴스 > 클래스
(If 상속) 인스턴스 > 자식 클래스 > 부모 클래스
부모 클래스가 여러 번 액세스 되지 않기 위함
상속 순서를 위한 예시
class A:
a = 1
print("A-1에있음")
def __init__(self):
print("A-2에있음")
print('A Constructor')
class B(A):
b=1
print("B-1에있음")
def __init__(self):
print("B-2에있음")
super().__init__()
print('B Constructor')
class C(A):
c=1
print("C-1에있음")
def __init__(self):
print("C-2에있음")
super().__init__()
print('C Constructor')
class D(B, C):
print("D-1에있음")
def __init__(self):
print("D-2에있음")
super().__init__()
print('D Constructor')
obj = D()
코드를 실행하면 위에부터 class를 실행함
이후 D class를 호출하면 MRO에 따라 D-B-C-A 순서대로 탐색함
이후 생성자 메서드가 실행되니 MRO의 반대인 A-C-B-D Constructor가 출력됨
즉 'A-1' > 'B-1' > 'C-1' > 'D-1' > 'D-2' > 'B-2' > 'C-2' > 'A-2' > 'A cons' > 'C cons' > 'B cons' > 'D cons' 의 순서로 출력됨