본문 바로가기
Algorithm/자료구조, 알고리즘

[코딩 + 알고리즘 완주반] 7일차. 상속, 다중상속

by newnu 2021. 3. 21.
반응형

# 클래스 상속, 다중 상속

상속 : 부모가 가지고 있는 모든 속성과 메소드 자식이 사용 가능

# 예제 1
# 상속 기본
# 슈퍼클래스(부모) 및 서브클래스(자식) -> 모든 속성, 메소드 사용 가능

# 라면 -> 속성(종류, 회사, 맛, 면 종류, 이름) : 부모 (공통)

class Car:
    """Parent Class"""
    def __init__(self,tp,color):
        self.type = tp
        self.color = color

    def show(self):
        return 'Car Class "Show Method!"'

class BmwCar(Car):
    """Sub Class"""
    def __init__(self,car_name,tp,color):
        super().__init__(tp,color) # 부모로부터 tp, color 받음
        self.car_name = car_name

    def show_model(self)  -> None:
        return "Your Car Name : %s" %self.car_name

class BenzCar(Car):
    """Sub Class"""
    def __init__(self,car_name,tp,color):
        super().__init__(tp,color) # 부모로부터 tp, color 받음
        self.car_name = car_name

    def show_model(self)  -> None:
        return "Your Car Name : %s" %self.car_name   

    def show(self): # 부모에도 있는 메소드 (오버라이딩)
        print(super().show()) # 부모에 있는 메소드도 출력
        return 'Car info : %s %s %s' %(self.car_name, self.type,self.color)

# 일반 사용
model1 = BmwCar('520d','sedan','red')

print(model1.color) # Super
print(model1.type) # Super
print(model1.car_name) # Sub
print(model1.show()) # Super
print(model1.show_model()) # Sub
print(model1.__dict__)

#Method Overriding(오버라이딩) # 부모에 있는 메소드와 이름이 같은 메소드
model2 = BenzCar("220d","suv",'black')

print(model2.show()) # Subclass 의 메소드 

# Parent Method Call
model3 = BenzCar('350s','sedan','silver')

print(model3.show())

# Inheritance Info
# mro() 모든 상속 보기
print(BmwCar.mro()) # [<class '__main__.BmwCar'>, <class '__main__.Car'>, <class 'object'>]
#object 클래스는 모든 클래스의 부모
print(BenzCar.mro()) # [<class '__main__.BenzCar'>, <class '__main__.Car'>, <class 'object'>]

# 예제2
# 다중 상속
class X():
    pass

class Y():
    pass

class Z():
    pass

class A(X,Y):
    pass
class B(Y,Z):
    pass
class M(B,A,Z):
    pass

print(M.mro()) # [<class '__main__.M'>, <class '__main__.B'>, <class '__main__.A'>, <class '__main__.X'>, <class '__main__.Y'>, <class '__main__.Z'>, <class 'object'>]
print(A.mro()) # [<class '__main__.A'>, <class '__main__.X'>, <class '__main__.Y'>, <class 'object'>]
반응형