상속이란?
- 부모 클래스 - 수퍼 클래스
- 자식 클래스 - 서브 클래스
부모 클래스를 상속받은 자식 클래스는 부모 클래스의 모든 속성과 메소드를 사용할 수 있다.
자동차는 여러 종류가 있지만 모든 자동차는 차량 종류(세단이냐 SUV냐 등), 차량 색과 같은 속성을 가지고 있다. 이런 공통 속성을 부모 클래스에서 지정해준다.
class Car:
"""Parent Class"""
def __init__(self, tp, color):
self.tp = tp
self.color = color
def show(self):
return '부모 클래스!'
부모 클래스에서 차량 타입, 색 속성을 지정했으니 이것을 이용해 개별 차량 클래스를 만들어보자.
class BMWCar(Car):
"""Sub Class"""
def __init__(self, car_name, tp, color):
# super는 부모 클래스를 의미. tp와 color를 부모 클래스에 넘겨준다.
super().__init__(tp, color)
self.car_name = car_name
def show_model(self):
return f'자식 클래스 차량 모델명은: {self.car_name}'
class BenzCar(Car):
"""Sub Class"""
def __init__(self, car_name, tp, color):
super().__init__(tp, color)
self.car_name = car_name
def show_model(self):
return f'자식 클래스 차량 모델명은: {self.car_name}'
이제 클래스라는 붕어빵 틀을 만들었으니 인스턴스라는 붕어를 만들어보자.
model1 = BMWCar('520d', 'sedan', 'black')
BMWCar
클래스를 이용해 차량 모델 520d, 차량 타입 세단, 차량 색깔 검은색인 개별 차량 인스턴스를 만들었다.
자식 클래스에는 차량 모델명을 제외하고는 다른 속성을 지정하지 않았지만 부모 클래스로부터 속성을 불러와서 쓰기 때문에 model1을 출력해보면 타입, 색 정보도 알아낼 수 있다.
print(model1.color)
print(model1.tp)
print(model1.car_name)
black
sedan
520d
자식 클래스에는 없는 show()
메소드도 부모 클래스로부터 불러올 수 있다.
print(model1.show())
부모 클래스!
자식 클래스에만 있는 show_model()
메소드는 당연히 사용할 수 있다.
print(model1.show_model())
자식 클래스 차량 모델명은: 520d
model1
객체를 출력해보면, 자식 클래스에서 초기화한 속성도 가지고 있고 부모 클래스에서 초기화한 속성도 상속받아서 가지고 있음을 확인할 수 있다.
print(model1.__dict__)
{'tp': 'sedan', 'color': 'black', 'car_name': '520d'}
메소드 오버라이딩
부모 클래스에서 선언한 메소드를 자식 클래스에서 커스텀해서 사용하는 것을 말한다.
부모 클래스의 show()
메소드를 자식 클래스에서도 선언해보자.
class BenzCar(Car):
"""Sub Class"""
def __init__(self, car_name, tp, color):
super().__init__(tp, color)
self.car_name = car_name
def show_model(self):
return f'자식 클래스 차량 모델명은: {self.car_name}'
def show(self):
return f'Car Info: {self.car_name}, {self.tp}, {self.color}'
우선, BenzCar
클래스를 이용해 객체 인스턴스를 생성한다.
model2 = BenzCar('c220d', 'sedan', 'silver')
이제 show()
메소드를 호출해본다. 이전에는 부모 클래스의 메소드를 불러왔다면 이번에는 자식 클래스에서 다시 선언한 show()
메소드를 불러온다.
print(model2.show())
Car Info: c220d, sedan, silver
상속 관계 정보 알아보기
mro()
함수는 해당 클래스 상속 정보를 리스트 형태로 리턴한다.
print(BMWCar.mro())
print(BenzCar.mro())
[<class '__main__.BMWCar'>, <class '__main__.Car'>, <class 'object'>]
[<class '__main__.BenzCar'>, <class '__main__.Car'>, <class 'object'>]
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
M 클래스는 클래스 B, A, Z를 상속받는데, A 클래스는 클래스 X, Y를 상속받았고, B 클래스는 클래스 Y, Z를 상속받았으므로 M 클래스는 모든 클래스 속성을 다 사용할 수 있다.
print(M.mro())
[<class '__main__.M'>, <class '__main__.B'>, \
<class '__main__.A'>, <class '__main__.X'>, \
<class '__main__.Y'>, <class '__main__.Z'>, <class 'object'>]