[python] 클래스 상속 사용하기

anjiyoo·2024년 3월 6일

Python

목록 보기
35/41
post-thumbnail

1.클래스 상속

  • 클래스 상속은 물려받은 기능을 유지한 채로 다른 기능 추가할 때 사용
  • 기반 클래스/부모 클래스/슈퍼 클래스 base blass : 기능 물려주는 클래스
  • 파생 클래스/자식 클래스/서브 클래스 derived class : 새롭게 만드는 클래스
  • is-a관계 : 상속은 명확하게 같은 종류이며 동등한 관계일 때 사용
# 상속
class 기반클래스이름:
	코드
    
class 파생클래스이름(기반클래스이름):  # 기반 클래스를 상속받음
	코드
# 기반 클래스의 속성 접근. 메소드 호출.
class 기반클래스이름:
	def __init__(self):
    	self.속성 = 값
        
class 파생클래스이름(기반클래스이름):
	def __init__(self):
    	super().__init__()  # super()로 기반 클래스의 메소드 호출
        super().속성  # super()로 기반 클래스의 속성에 접근
        super(파생클래스, self).속성  # super에 파생 클래스와 self를 넣는 형식
# 상속 관계 확인하기
issubclass(파생클래스, 기반클래스)
# 사람 클래스로 학생 클래스 만들기
class Person:
	def greeting(self):
    	print('안녕하세요.')
        
class Student(Person):
	def study(self):
		print('공부하기')
        
james = Student()
james.greeting()  # 안녕하세요 : 기반클래스의 메소드 호출
james.study()  # 공부하기 : 파생클래스에 추가한 메소드

1-1.포함 관계

  • has-a 관계 : 리스트 속성에 인스턴스를 넣어서 관리
class Person:
	def greeting(self):
    	print('안녕하세요.')
        
class PersonList():
	def __init__(self):
    	self.person_list = []  # 리스트 속성에 Person 인스턴스를 넣어서 관리
        
    def append_person(self, person):  # 리스트 속성에 Person 인스턴스를 추가하는 함수
    	self.person_list.append(person)

2.기반 클래스 속성 사용하기


2-1.super()로 기반 클래스 초기화 하기

  • 기반클래스의 __init__ 메소드를 호출해주면 기반 클래스가 초기화되어서 속성이 만들어짐
super().메소드()

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

class Student(Person):
	def __init__(self):
    	print('Student __init__')
        super().__init__()
        self.school = '파이썬 코딩 도장'
        
james = Student()
print(james.school) 
print(james.hello)  # 기반 클래스의 속성 출력

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

  • 파생 클래스에서 __init__ 를 생략한다면 기반 클래스의 __init__이 자동으로 호출되어 super() 사용하지 않아도 됨
  • super()은 파생 클래스와 self를 넣어서 현재 클래스가 어떤 클래스인지 알 수 있음
super(파생클래스, self).메소드
class Student(Person):
	def __init__(self):
    	print('Student' __init__')
        super(Student, self).__init))()  # super(파생클래스, self)로 기반 클래스의 메소드 호출
        self.school = '파이썬 코딩 도장'

3.메소드 오버라이딩 사용하기

  • 오버라이딩 : 기반 클래스에서 메소드를 무시하고 새로운 메소드를 만든다
  • 프로그램에서 어떤 기능이 같은 메소드 이름으로 계속 사용되어야 할 때 사용
  • 원래 기능을 유지하면서 새로운 기능을 덧붙일때 사용
class Person:
	def greeting(self):
    	print('안녕하세요')
        
class Student(Person):
	def greeting(self):
    	super().greeting()  # 기반 클래스의 메소드 호출하여 중복 줄임
        print('저는 파이썬 코딩 도장 학생입니다.')
        
james = Student()
james.greeting()

4.다중 상속 사용하기

  • 여러 기반 클래스로부터 상속을 받아서 파생 클래스를 만드는 방법
class 기반클래스이름1:
	코드
    
class 기반클래스이름2:
	코드
    
class 파생클래스이름(기반클래스이름1, 기반클래스이름2):
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()  # 안녕하세요 : 기반 클래스 Person의 메소드 호출
james.manage_cradit()  # 학점 관리 : 기반 클래스 University의 메소드 호출  
james.study()  # 공부 하기 : 파생 클래스 Undergraduate에 추가한 study 메소드

5.추상 클래스 사용하기

  • 메소드 목록만 가진 클래스
  • 추상 클래스는 인스턴스를 만들 수 없음 (오로지 상속, 파생클래스에서 반드시 구현해야할 메소드 정해 줄 때 사용)
  • 상속받는 클래스에서 메소드 구현을 강제하기 위해 사용
  • 추상 클래스의 추상 메소드를 모두 구현했는지 확인하는 시점은 파생 클래스가 인스턴스를 만들 때
from abc import *

class 추상클래스이름(metaclass=ABCMeta):
	@abstractmethod
    def 메소드이름(self):
    	코드
from abc import *

class StudentBase(metaclass=ABCMeta):  # 추상 클래스
	@abstracmethod
    def study(self):  # 추상 메소드 정의
    	pass
        
    @abstractmethod
    def go_to_school(self):  # 추상 메소드 정의
    	pass
        
class Student(StudentBase):  # 추상 클래스 상속받음
	def study(self):  # 추상 메소드 구현
    	print('공부하기')  
        
    def go_to_school(self):  # 추상 메소드 구현
    	print('학교가기')
        
james = Student()
james.study()  # 파생 클래스 인스턴스 생성
james.go_to_school()  # 파생 클래스 인스턴스 생성

6.덕 타이핑

  • 실제 타입(클래스)은 상관하지 않고, 구현된 메소드로만 판단

    "마나약 어떤 새가 오리처럼 걷고, 헤엄치고, 꽥꽥거리는 소리를 낸다면 나는 그 새를 오리라 부르겠다"


7.믹스인

  • 다른 클래스에서 사용할 수 있도록 공통적인 메소드를 모아 놓은 클래스
  • 자체 인스턴스 속성을 가지고 있지 않고 __init__ 메소드를 구현하지 않음
profile
기록으로 흔적을 남기는 것을 좋아합니다

0개의 댓글