[python] 파이썬 상속(inheritance), 오버라이딩(overriding) 개념

업데이트:

파이썬 상속(inheritance)과 오버라이딩(overriding) 개념

본 포스팅은 코딩도장을 참고하였습니다.

상속 정의

  • 부모클래스(parent class), 슈퍼클래스(super class), 기반클래스
  • 자식클래스(child class), 서브클래스(subclass), 파생클래스

기본 문법

class 기반클래스이름:
    코드
 
class 파생클래스이름(기반클래스이름):
    코드

예제

class Person:
    def greeting(self):
        print('안녕하세요.')
 
class Student(Person):
    def study(self):
        print('공부하기')
> james = Student()
> james.greeting()    # 안녕하세요.: 기반 클래스 Person의 메서드 호출
안녕하세요.
> james.study()       # 공부하기: 파생 클래스 Student에 추가한 study 메서드
공부하기 

상속관계확인

> issubclass(Student, Person)
True

초기화가 포함될 경우 슈퍼클래스의 변수 반환

class Person:
    def __init__(self):
        print('Person __init__')
        self.hello = '안녕하세요.'
 
class Student(Person):
    def __init__(self):
        print('Student __init__')
        self.school = '파이썬 코딩 도장'
 
james = Student()
print(james.school)
print(james.hello)    # 기반 클래스의 속성을 출력하려고 하면 에러가 발생함

위 코드가 에러나는 이유는 기반클래스 Person의 init 메소드가 호출되지 않았기 때문에 self.hello가 실행되지 않습니다.

super()로 기반클래스 초기화하기

class Person:
    def __init__(self):
        print('Person __init__')
        self.hello = '안녕하세요.'
 
class Student(Person):
    def __init__(self):
        print('Student __init__')
        super().__init__()                # super()로 기반 클래스의 __init__ 메서드 호출
        self.school = '파이썬 코딩 도장'
 
james = Student()
print(james.school)
print(james.hello)

기반 클래스를 초기화하지 않아도 되는 경우

class Person:
    def __init__(self):
        print('Person __init__')
        self.hello = '안녕하세요.'
 
class Student(Person):
    pass
 
james = Student()
print(james.hello)

이처럼 파생 클래스에 init 메서드가 없다면 기반 클래스의 init 이 자동으로 호출되므로 기반 클래스의 속성을 사용할 수 있습니다.

오버라이딩

오버라이딩은 기존의 함수를 덮어씌운다는 느낌입니다.

class Person:
    def greeting(self):
        print('안녕하세요.')
 
class Student(Person):
    def greeting(self):
        super().greeting()    # 기반 클래스의 메서드 호출하여 중복을 줄임
        print('저는 파이썬 코딩 도장 학생입니다.')
> james = Student()
> james.greeting()
안녕하세요. 
저는 파이썬 코딩 도장 학생입니다.