일단 하자
# 7 - 2. 클래스 상속 및 다중 상속 본문
1. 클래스 상속
2. 클래스 다중 상속
1. 상속
부모의 속성을 물려받는 것. 파이썬은 다중 상속을 지원한다.
상속의 기본
subclass(자식)는 super class(부모)의 모든 속성, 메서드를 사용할 수 있다. 상속을 이용하면 코드를 재활용할 수 있고, 그것은 반복을 피하도록 한다. 그러므로 코드가 간결해지고, 유지보수와 생산성에 밀접한 연관이 있다.
예를 들어, 라면 클래스를 정의한다고 하자. 라면의 속성으로 종류, 회사, 맛, 면종류, 이름 등이 있는데 이렇게 라면에 공통적인 속성을 뽑아낼 수 있다. 그렇다면 이러한 부모의 공통적인 속성을 물려받아서 자식에서는 자신들만의 구체적인 속성을 넣는다.
클래스 정의
class Car:
"""Parent Class""" # PEP8원칙으로 클래스의 의미를 적어둔다.
def __init__(self, tp, color):
self.type = tp
self.color = color
def show(self):
return 'Car Class "Show Method!"'
class BmwCar(Car): # BmwCar의 부모로 Car를 상속. 이렇게 클래스 인자로 부모클래스를 받는다.
"""Sub Class"""
def __init__(self, car_name, tp, color):
# type과 color는 부모의 속성으로 들어간다.
super().__init__(tp, color) # 부모의 init함수를 호출하고 인자로 tp, color를 준다.
self.car_name = car_name
def show_model(self) -> None:
return "Your Car Name : %s" % self.car_name
class BenzCar(Car): # Car를 상속받는다.
"""Sub Class"""
def __init__(self, car_name, tp, color):
super().__init__(tp, color)
self.car_name = car_name
def show_model(self) -> None:
return "Your Car Name : %s" %self.car_name
def show(self): # 부모한테도 있는 메서드를 자식에서 재정의
return 'Car Info : %s %s %s' %(self.car_name, self_type, self.color)
클래스 사용
BmwCar 클래스
model1 = BmwCar('520d', 'sedan', 'red')
print(model1.color) # 부모 속성
print(model1.type) # 부모 속성
print(model1.car_name) # 자식 속성
print(model1.show()) # 부모 메서드
print(model1.show_model()) # 자식 메서드
print(model1.__dict__) # 자식의 네임스페이스를 찍어보면 부모의 속성도 갖고있는 것을 알 수 있다.
model1은 부모의 show()메서드를 호출하였다.
BenzCar 클래스
model2 = BenzCar('220d', 'sub', 'black')
print(model2.show())
+ 오버라이딩
model1은 show()가 없어서 부모의 show()가 호출되었지만 model2는 부모의 show()를 재정의해서 자식의 show()가 호출되었다. 이것이 오버라이딩이다. 자식의 입맛에 맞게 부모의 속성을 디자인 할 수 있다.
model3 = BenzCar('350s', 'sedan', 'silver')
print(model3.show()) # overrding된 show가 호출된다.
+ Inheritance Info (상속 정보)
상속의 깊이(depth)가 깊을 때 이것을 표현해주는 mro()메서드가 있다.
print(BmwCar.mro()) # 왼쪽에서 오른쪽으로 자식에서 부모로 간다.
print(BenzCar.mro())
2. 다중 상속
class X(object): # 모든 클래스는 object클래스를 상속받는다.
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())
너무 복잡한 다중상속은 코드를 해석하기 힘들게 만든다. depth가 깊어질수록 코드가 복잡해진다. 보통은 2개가 최대이다. 덧붙이면 C++에서는 Deadly Diamond of Death라는 용어가 있을만큼 다중상속을 지양한다.
'파이썬 웹 개발 > 파이썬 기초 개념' 카테고리의 다른 글
# 9. 파일 입출력 (0) | 2019.12.26 |
---|---|
# 8. 모듈과 패키지 (0) | 2019.11.28 |
# 7 - 1. 클래스 선언 및 self의 이해 (0) | 2019.11.14 |
# 6. 함수 및 람다(lambda) (0) | 2019.11.13 |
# 5 - 3. 조건문, 반복문 퀴즈 (0) | 2019.11.13 |
Comments