super()

Nam Eun-Ji·2020년 11월 26일
0

자식 클래스에서 부모 클래스의 내용을 사용하고 싶을 때 사용

super().부모클래스내용


다중상속에서 오는 문제 : 부모클래스.init() vs super().init()

다음 코드는 최상위 클래스 메소드를 두 번 호출하게 되어, 뜻대로 프로그램이 움직이지 않는 버그가 나거나 코드가 반복되어 지연이 발생할 수 있다.

# 클래스 선언
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



상속구조에서 순서를 찾는 방법 : mro

위 코드와 연계.

PartTimer.__mro__
(__main__.PartTimer,
 __main__.Student,
 __main__.Worker,
 __main__.Person,
 object)

참고 : https://stackoverflow.com/questions/3277367/how-does-pythons-super-work-with-multiple-inheritance




super()의 사용은 유지보수를 편리하게 한다.

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...



class 상속 순서

  • 다중 상속된 클래스의 나열 순서가 자식 클래스가 속성(멤버변수,메서드) 호출에 영향을 줌
  • 상속된 클래스 중 앞에 나열된 클래스부터 속성을 찾음

아래 코드를 보면 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
profile
한 줄 소개가 자연스러워지는 그날까지

0개의 댓글