본문 바로가기

카테고리 없음

OOP - 클래스 상속

상속

: 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' 의 순서로 출력됨