본문 바로가기
Python

파이썬 상속

by 승환파크 2023. 5. 10.

상속(inheritance)

다른 누군가가 만들어 놓은 기본 형태에 내가 원하는 것만 추가하거나 교체하는 것이다.

기반이 되는 것을 부모(parent)라고 부르고, 이를 기반으로 생성된 것을 자식(child)라고 부른다.

부모가 자식에게 자신의 기반을 물려주는 것이기 때문에 상속이라고 불린다.

class Person: # 부모 클래스
    def __init__(self, name):
        self.name = name
        
    def eat(self, food):
        print(self.name + "가 " + food + "를 먹습니다.")

class Student(Person): # 자식 클래스
    def __init__(self, name, school):
        super().__init__(name)
        self.school = school
        
    def study(self):
        print(self.name + "는 " + self.school + "에서 공부합니다.")

potter = Student("해리포터", "호그와트")
potter.study()

# 결과값
# 해리포터는 호그와트에서 공부합니다.

potter.eat("감자")

# 결과값
# 해리포터가 감자를 먹습니다.

 

부모 클래스와 자식 클래스의 생성 순서

# 부모클래스 선언
class Parent: 
    def __init__(self):
        self.value = "테스트"
        print("Parent 클래스의 __init__() 메서드가 호출되었습니다.")
        
    def test(self):
        print("Parent 클래스의 test() 매서드 입니다.")

# 자식 클래스 선언
class Child(Parent):
    def __init__(self):
        super().__init__() # 부모의 생성자 호출
        print("Child 클래스의 __init__() 메서드가 호출되었습니다.")

child = Child()

child.test()

print(child.value)

# 결과값
# __init__() 부분 - 객체 생성시 실행
# Parent 클래스의 __init__() 메서드가 호출되었습니다.
# Child 클래스의 __init__() 메서드가 호출되었습니다.

# test() 부분
# Parent 클래스의 test() 매서드 입니다.

# print() 부분
# 테스트

항상 생성은 부모 클래스가 먼저 생성 되고 자식 클래스는 그 다음에 생성이 된다.

 

자식 클래스의 생성자

자식 클래스는 부모 클래스가 없으면 존재할 수 없다.

따라서 자식 클래스의 생성자를 구현할 때에는 반드시 부모 클래스의 생성자를 먼저 호출해야만 한다.

만약 자식 클래스에서 생성자를 생성하지 않고 생략한다면 부모 클래스의 생성자가 자동으로 호출되기 때문에 super() 를 사용하지 않아도 된다.

class Person:
	def __init__(self):
    	self.hello = "안녕하세요"

class Student(Person):
	pass

james = Student()
print(james.hello)

# 결과값
# 안녕하세요

 

자식 클래스의 인스턴스 자료형

자식 클래스의 객체는 자식 클래스의 객체임과 동시에 상속을 받은 부모 클래스의 객체이기도 하다.

# 위의 코드에서 생성한 james 로 확인하기
print(isinstance(james, Student))
print(isinstance(james, Person))

# 결과값
# True
# True

print(type(james))
# 결과값
# <class '__main__.Student'>
# 부모 클래스의 객체인지는 확인이 불가능

 

 

클래스 상속의 활용

class CustomException(Exception):
    def __init__(self):
        super().__init__()
        print("ㅐㄴ가 만든 오류가 생성되었습니다.")
        
    def __str__(self):
        return "오류 발생"

raise CustomException
# 결과
# 내가 만든 오류가 생성되었습니다.
# CustomException: 오류 발생

이 때 __str__() 함수는 부모 클래스(Exception)에도 정의되어 있다.

부모에 정의되어 있는 함수를 자식에서 다시 정의하는 것을 재정의 또는 오버라이드(override)라고 부른다.

기존 함수 또는 변수 이외의 것을 완전히 새로 정의하는 것도 가능하다.

class Person:
	def greeting(self):
    	print("안녕하세요")

class Student(Person):
	def greeting(self):
    	print("안녕하세요. 인스턴스 메서드입니다.")

james = Student()
james.greeting()

# 결과값
# 안녕하세요 인스턴스 메서드입니다.

 

상속을 받는 이유중 하나는 위의 코드에서 보면 greeting 메서드를 두 클래스에서 전부 만들었지만 부모 클래스의 메서드를 사용하면 코드의 중복성을 줄일 수 있다.

class Student(Person):
    def greeting(self):
        super().greeting() # 부모클래스의 메서드를 이용하여 중복을 줄임
        print("인스턴스 메서드입니다.")

james = Student()
james.greeting()

# 결과값
# 안녕하세요
# 인스턴스 메서드입니다.

 

다중 상속

다른 누군가가 만들어 놓은 형태들을 조립해서 내가 원하는 것을 만드는 것이다.

class Person:
	def greeting(self):
		print("안녕하세요")

class University:
	def manage_credit(self):
    	print("학점 관리")

class Undergraduate(Person, University):
	def study(self):
		print("공부하기")

james = Undergraduate()
james.greeting()
james.manage_credit()
james.study()

# 결과값
# 안녕하세요
# 학점 관리
# 공부하기

'Python' 카테고리의 다른 글

파이썬 정적 크롤링  (0) 2023.05.10
파이썬 웹 크롤링  (1) 2023.05.10
파이썬 프라이빗 변수와 getter, setter  (1) 2023.05.10
파이썬 가비지 컬렉터  (1) 2023.05.10
파이썬 클래스 변수와 클래스 메서드  (0) 2023.05.10