본문 바로가기
IT 개인학습/Python

Class 상속(inheritance)

by kiimy 2021. 7. 18.
728x90
728x90

상속(inheritance)

국가라는 클래스가 있고, 그것을 상속받은 한국, 일본, 중국, 미국 등의 클래스를 만들 수 있으며,

국가라는 클래스의 기본적인 속성으로 인구라는 속성을 만들었다면, 상속 받은 한국, 일본, 중국 등등의

클래스에서 부모 클래스의 속성과 메소드를 사용할 수 있음

class 부모클래스: # (Parent Class, Super class)
    ...내용...

class 자식클래스(부모클래스): # (Child class, sub class)
    ...내용...
    
# 자식클래스에서는 부모클래스의 속성과 메소드는 기재하지 않아도 포함이됨

MRO(Method Resolution Order)란? 메소드 결정 순서 __mro__

파이썬은 기본적으로 다중 상속을 지원

죽음의 다이아몬드는 다중 상속을 받을 때, 부모 클래스에 동일한 이름의 메소드를 호출하려 할 때

어떤 부모의 메소드를 호출해야 할 지 모르기 때문에 발생하는 문제 발생

즉, 하나의 구문이 두 가지 이상의 의미로 해석 될 수 있을 때 발생하는 문제

'죽음의 다이아몬드' = 부모 클래스들이 똑같은 이름의 메소드를 가지고 있을 때

이 문제를 해결하기 위한

==> MRO는 자식과 부모 클래스를 전부 포함하여 메소드의 실행 순서를 지정하는 것

class Human:
    def say(self):
        print("안녕")

class Mother(Human):
    def say(self):
        print("엄마")

class Father(Human):
    def say(self):
        print("아빠")

class Son(Mother, Father):
    def say(self):
        print("응애")

print(Son.__mro__)
(<class '__main__.Son'>, <class '__main__.Mother'>, 
<class '__main__.Father'>, <class '__main__.Human'>, 
<class 'object'>)

자식클래스 -> 부모클래스(먼저 상속받은 순서대로 우선순위가 높음= (mother, Father))

-> (부모클래스가 상속을 받았을 경우 그 부모 클래스) -> 최상위 object 클래스 순서로 메소드가 호출

class Human:
    def say(self):
        print("안녕")

class Mother(Human):
    def say(self):
        super().say() # super 클래스 사용

class Father(Human):
    def say(self):
        print("아빠")


class Son(Mother, Father):
    pass

baby = Son()
baby.say()

** 중요

- superclass인 Human 속성인 say가 나올것 같지만 mro 순서상 mother 다음이 father이기 때문에 

Mother 클래스의 super 클래스가 다음 우선순위를 가지는 Father 클래스를 가리키게 된 것

( 그렇다고 Superclass가 Human인건 변함없음 ?)

참조 : https://tibetsandfox.tistory.com/26

 

메소드 오버라이딩 (Method overriding)

메소드 오버라이딩은 부모 클래스의 메소드를 자식 클래스에서 재정의 하는 것

class Country:
    """Super Class"""

    name = '국가명'
    population = '인구'
    capital = '수도'

    def show(self):
        print('국가 클래스의 메소드입니다.')


class Korea(Country):
    """Sub Class"""

    def __init__(self, name,population, capital):
        self.name = name
        self.population = population
        self.capital = capital

    def show(self):
        print(
            """
            국가의 이름은 {} 입니다.
            국가의 인구는 {} 입니다.
            국가의 수도는 {} 입니다.
            """.format(self.name, self.population, self.capital)
        )
        
a= Korea(name, pop, cap)
a.show()
부모 클래스의 show()메소드는 무시되고 자식클래스의 show()메소드가 수행

부모 메소드 호출하기 ( super() 사용 )

자식클래스 내에서 코드에서도 부모클래스를 호출

(즉, 부모클래스도 나오고 자식클래스도 나오고)

class Korea(Country):

    ... 생략

    def show(self):
        super().show()
        print(
            """
            국가의 이름은 {} 입니다.
            국가의 인구는 {} 입니다.
            국가의 수도는 {} 입니다.
            """.format(self.name, self.population, self.capital)
        )
728x90

'IT 개인학습 > Python' 카테고리의 다른 글

Python에서 시간 측정하기(Decorator, Command line)  (0) 2021.09.26
Error, try ... except  (0) 2021.07.18
매직메소드  (0) 2021.07.18
Class , Object , Method ( OOP )  (0) 2021.07.18
Python 함수  (0) 2021.07.18

댓글