24. 상속
- 부모 클래스가 갖는 모든 메소드가 자식 클래스에도 담긴다
- 자식 클래스에는 별도의 메소드를 추가할 수 있다
class Father:
def run(self):
print("so fast!!!")
class Son(Father):
def jump(self):
print("so high!!!")
def main():
s = Son()
s.run()
s.jump()
main()
다중 상속
class Father:
def run(self):
print("so fast!!!")
class Mother:
def dive(self):
print("so deep!!!")
class Son(Father, Mother):
def jump(self):
print("so high!!!")
def main():
s = Son()
s.run()
s.dive()
s.jump()
main()
method overriding과 super
class Father:
def run(self):
print("so fast, dad style")
class Son(Father, Mother):
def run(self):
print("so fast, son style")
def main():
s = Son()
s.run() # Son의 run 메소드 호출
main()
- method overriding : 상속 관계에 있어서 부모 클래스가 갖는 메소드와 동일한 이름의 메소드를 자식 클래스가 정의하는 경우
- 이 경우 부모 클래스의 메소드는 보이지 않는 상태가 된다(호출 불가능 상태)
class Father:
def run(self):
print("so fast, dad style")
class Son(Father, Mother):
def run(self):
print("so fast, son style")
def run2(self):
super().run()
def main():
s = Son()
s.run()
s.run2()
main()
- 가려진 메소드를 호출할 때는 앞에다 super()을 붙여주면 된다
__init __ 메소드의 오버라이딩
# car.py
class Car:
def __init__(self, id, f):
self.id = id
self.fuel = f
def drive(self):
sefl.fuel -= 10
def add_fuel(self, f):
self.fuel += f
def show_info(self):
print("id:", self.id)
print("fuel:", self.fuel)
def main():
c = Car("32러 5234", 0)
c.add_fuel(100)
c.drive()
c.show_info()
main()
# truck.py
class Car:
def __init__(self, id, f):
self.id = id
self.fuel = f
def drive(self):
sefl.fuel -= 10
def add_fuel(self, f):
self.fuel += f
def show_info(self):
print("id:", self.id)
print("fuel:", self.fuel)
class Truck(Car):
def __init__(self, id, f, c):
super().__init__(id, f)
self.cargo = c
def add_cargo(self, c):
self.cargo += c
def show_info(self):
super().show_info()
print("cargo:", self.cargo)
def main():
t = Truck("42러 5959", 0, 0)
t.add_fuel(100)
t.add_cargo(50)
t.drive()
t.show_info()
main()
- Truck class는 위와 같은 형태로 __init __ 메소드를 정의해야 Truck에 속한 변수뿐 아니라 Car에 속한 변수들도 적절히 생성되고 초기화된다
- 즉, 자식 클래스의 __init __메소드 내에서 부모 클래스의 __init __메소드를 호출해야 한다
- 자식 클래스의 __init __은 부모의 변수를 초기화할 값도 함께 전달받아야 한다
- 결론적으로 객체 생성 시 자동으로 호출되는 __init __은 오버라이딩 해야 하는 메소드이면서 동시에 가려진 부모의 __init __을 반드시 호출해야 하는 메소드이다
'프로그래머 > Python' 카테고리의 다른 글
[윤성우의 열혈 파이썬 중급편] 26. 스페셜 메소드 (0) | 2020.12.24 |
---|---|
[윤성우의 열혈 파이썬 중급편] 25. isintance 함수와 object 클래스 (0) | 2020.12.24 |
[윤성우의 열혈 파이썬 중급편] 23. 클래스와 객체의 본질 (0) | 2020.12.24 |
[윤성우의 열혈 파이썬 중급편] 22. 메소드 기반 문자열 조합 (0) | 2020.12.24 |
[윤성우의 열혈 파이썬 중급편] 21. 표현식 기반 문자열 조합 (0) | 2020.12.24 |