자식 클래스에서 부모 클래스의 내용을 사용하고 싶을 때 사용
super().부모클래스내용
다음 코드는 최상위 클래스 메소드를 두 번 호출하게 되어, 뜻대로 프로그램이 움직이지 않는 버그가 나거나 코드가 반복되어 지연이 발생할 수 있다.
# 클래스 선언
class Person:
def __init__(self):
print('I am a person')
class Student(Person):
def __init__(self):
Person.__init__(self)
print('I am a student')
class Worker(Person):
def __init__(self):
Person.__init__(self)
print('I am a worker')
# 다중 상속
class PartTimer(Student, Worker):
def __init__(self):
Student.__init__(self)
Worker.__init__(self)
print('I am a part-timer and student')
parttimer1 = PartTimer()
I am a person
I am a student
I am a person
I am a worker
I am a part-timer and student
# 클래스 선언
class Person:
def __init__(self):
print('I am a person')
class Student(Person):
def __init__(self):
super().__init__()
print('I am a student')
class Worker(Person):
def __init__(self):
super().__init__()
print('I am a worker')
# 다중 상속
class PartTimer(Student, Worker):
def __init__(self):
super().__init__()
print('I am a part-timer and student')
parttimer1 = PartTimer()
I am a person
I am a worker
I am a student
I am a part-timer and student
위 코드와 연계.
PartTimer.__mro__
(__main__.PartTimer,
__main__.Student,
__main__.Worker,
__main__.Person,
object)
참고 : https://stackoverflow.com/questions/3277367/how-does-pythons-super-work-with-multiple-inheritance
ChildA의 부모클래스가 변경된다면, 클래스 내부에서 Base클래스를 사용하고 있는 모든 곳을 변경해주어야한다.
ChildB처럼 super()를 사용한다면 부모클래스 한 번만 바꿔주면 된다.
class Base(object):
def __init__(self):
print("Base created")
class ChildA(Base):
def __init__(self):
Base.__init__(self)
class ChildB(Base):
def __init__(self):
super(ChildB, self).__init__()
ChildA()
ChildB()
Base created
Base created
예 1
# -*- coding: utf8 -*-
class Car:
def __init__(self, model, color):
self.model = model
self.color = color
def show_info(self):
print(f"maker: {self.maker}, model: {self.model}, color: {self.color}")
class Hyundai(Car):
def __init__(self, model, color):
super().__init__(model, color)
self.maker = "Hyundai"
class Tesla(Car):
def __init__(self, model, color):
super().__init__(model, color)
self.maker = "Tesla"
def show_info(self):
print(f"maker: {self.maker}, model: {self.model}, color: {', '.join(self.color)}")
avante = Hyundai('avante', 'blue')
X = Tesla('X', ['gray', 'white', 'black'])
avante.show_info()
X.show_info()
maker: Hyundai, model: avante, color: blue
maker: Tesla, model: X, color: gray, white, black
예 2
class Animal:
def __init__(self, name):
self.name = name
def bark(self):
print('Hmm...')
class Dog(Animal):
def bark(self):
print('Woof!')
def super_bark(self):
super().bark()
max = Dog('Max')
max.bark()
max.super_bark()
Woof!
Hmm...
아래 코드를 보면 Student와 Worker 모두 play 메소드가 있는데, Student 클래스가 먼저 상속되어, Student의 play 메소드가 실행되었다.
# 클래스 선언
class Person:
def sleep(self):
print('sleep')
class Student(Person):
def study(self):
print('Study hard')
def play(self):
print('play with friends')
class Worker(Person):
def work(self):
print('Work hard')
def play(self):
print('drinks alone')
# 다중 상속
class PartTimer(Student, Worker):
def find_job(self):
print('Find a job')
parttimer1 = PartTimer()
parttimer1.study()
parttimer1.work()
parttimer1.play()
Study hard
Work hard
play with friends