본문 바로가기

프로그래머/Python

[윤성우의 열혈 파이썬 중급편] 24. 상속

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 __을 반드시 호출해야 하는 메소드이다