[Python] 17. 상속
본 포스팅은 “윤성우의 열혈 파이썬 중급편” 책 내용을 기반으로 작성되었습니다. 잘못된 내용이 있을 경우 지적해 주시면 감사드리겠습니다.
17-1. 부모 클래스와 자식 클래스
다음 그림을 보자.
그림 17-1. 파이썬 상속의 예 (참조: https://techvidvan.com/tutorials/python-inheritance/)
- Vehicle 클래스: 부모클래스, 슈퍼클래스, 상위클래스
- Car, Bus, Bike 클래스: 자식클래스, 서브클래스, 하위클래스
상속을 하면 부모클래스가 갖는 모든 메소드를 자식클래스도 갖게 된다!
또한, 자식클래스에는 부모클래스가 갖는 메소드 외 별도의 메소드도 추가될 수 있다!
class Vehicle:
def run(self):
print("가즈아!")
class Car(Vehicle):
def go(self):
print("붕붕~")
class Bus(Vehicle):
def go2(self):
print("부아앙~")
class ElectricCar(Car, Bus): # 둘 이상의 상속도 가능
def tesla(self):
print("나는 대세")
c = Car()
c.run()
c.go()
e = ElectricCar()
e.run()
e.go()
e.go2()
e.tesla()
(결과) 가즈아!
붕붕~
가즈아!
붕붕~
부아앙~
나는 대세
17-2. 메소드 오버라이딩과 super
상속 관계에 있을 때, 부모 클래스가 갖는 메소드와 동일한 이름의 메소드를 자식클래스가 갖는다면 어떻게 될까?
이것을 가리켜 메소드 오버라이딩 이라고 한다!
메소드 오버리이딩의 경우에는 부모클래스의 메소드는 호출이 불가능한 상태가 된다.
class Car(Vehicle):
def go(self):
print("붕붕~")
class ElectricCar(Car): # 둘 이상의 상속도 가능
def go(self):
print("우우웅..")
def go2(self): # 만약 부모클래스의 go()를 호출하고 싶다면 super()를 활용하자!
super().go()
e = ElectricCar()
e.go()
e.go2()
(결과) 우우웅..
붕붕~
17-3. init 메소드의 오버라이딩
메소드 오버라이딩을 할 수 밖에 없으면서 호출이 불가능한 메소드를 호출해야만 하는 상황이 있을 수 있다.
class Car:
def __init__(self, id, f):
self.id = id
self.fuel = f
def drive(self):
self.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)
t = Truck("52오5252", 0, 0)
t.add_fuel(100)
t.add_cargo(50)
t.drive()
t.show_info()
(결과) id: 52오5252
fuel: 90
cargo: 50
위 상황은 자식클래스의 __init__ 메소드 내 부모클래스의 __init__ 메소드가 호출되어야 하는 상황이다. 그래야 객체 생성 시 필요로 하는 모든 변수를 초기화 할 수 있다. 이 때 자식클래스의 __init__ 는 부모의 변수를 초기화 할 값도 함께 전달받아야 한다!
Leave a comment