Python 중급 4. 클래스 상속,다중상속,오버라이딩,추상클래스

yoong·2023년 4월 15일

1. Python

목록 보기
13/21

Python 중급 4.

01.클래스 상속

1. 상속(inheritance)

: 다른 클래스의 기능을 내 것처럼 사용하자.

class NormalCar:

    def drive(self):
        print('[NormalCar] drive() called!! ')

    def back(self):
        print('[NormalCar] back() called!! ')

class TurboCar(NormalCar):

    def turbo(self):
        print('[TurboCar] turbo() called!! ')

myTurboCar = TurboCar()

myTurboCar.turbo()
myTurboCar.drive()
myTurboCar.back()

02.생성자

  1. 객체가 생성될 때, 생성자를 호출하면 init()가 자동 호출됨

  1. init가 속성을 초기화 함.
Class A:

	def __init__(self,Num1,Num2)
    	print('[A]__init__() called!!')
        
        self.num1 = num1
        self.num2 = num2
        
        
  1. 상위 클래스의 속성을 초기화 하기 위해서는 super를 사용
    : (init으로 속성초기화가 되면 child_class의 속성은 초기화 되서 값 사용이 가능하지만 parent_class는 속성이 초기화 되지 않아서 값 사용이 불가능)

# 방법1 (강제호출)
class P_Class:
    def __init__(self,pNum1,pNum2):
        print('[P_Class] __init__() called!!')
        self.pNum1 = pNum1
        self.pNum2 = pNum2

class C_Class(P_Class):
    def __init__(self,cNum1,cNum2):
        print('[C_Class] __init__() called!!')

        P_Class.__init__(self,cNum1,cNum2) #강제호출
        self.cNum1 = cNum1
        self.cNum2 = cNum2

cls = C_Class(10,20)

#방법2 
class P_Class:
    def __init__(self,pNum1,pNum2):
        print('[P_Class] __init__() called!!')
        self.pNum1 = pNum1
        self.pNum2 = pNum2

class C_Class(P_Class):
    def __init__(self,cNum1,cNum2):
        super().__init__(cNum1,cNum2) #super는 self값 안넣어도됨 

        P_Class.__init__(self,cNum1,cNum2) #강제호출
        self.cNum1 = cNum1
        self.cNum2 = cNum2

cls = C_Class(10,20)

[실습] : 중간고사 클래스와 기말고사 클래스를 상속관계로 만들고 각 점수를 초기화 + 총점,평균 반환 기능 만들기

class MidExam:

    def __init__(self,s1,s2,s3):
        print('[MidExam] __init__()')

        self.mid_kor_score = s1
        self.mid_eng_score = s2
        self.mid_mat_score = s3

    def printScores(self):
        print(f'mid_kor_score: {self.mid_kor_score}')
        print(f'mid_eng_score: {self.mid_eng_score}')
        print(f'mid_mat_score: {self.mid_mat_score}')


class FinExam(MidExam):

    def __init__(self,s1,s2,s3,s4,s5,s6):
        print('[FinExam] __init__()')

        super().__init__(s1,s2,s3)

        self.fin_kor_score = s4
        self.fin_eng_score = s5
        self.fin_mat_score = s6

    def printScores(self):
        super().printScores()
        print(f'fin_kor_score: {self.fin_kor_score}')
        print(f'fin_eng_score: {self.fin_eng_score}')
        print(f'fin_mat_score: {self.fin_mat_score}')

    def getTotalScore(self):
        total = self.mid_kor_score + self.mid_eng_score + self.mid_mat_score
        total += self.fin_kor_score + self.fin_eng_score + self.fin_mat_score

        return total
    
    def getAverageScore(self):
        return self.getTotalScore() / 6

exam = FinExam(85,90,20,30,40,50)
exam.printScores() #중간,기말 과목별 점수

print(f'총점: {exam.getTotalScore()}')
print(f'평균: {round(exam.getAverageScore(),2)}')

03.다중상속

: 2개 이상의 클래스를 상속하는 경우
단, 주의할점은 중복코드가 있으면 헷갈릴 수도 있기 때문에 다중상속을 남발하면 안좋음!

04.오버라이딩

: 하위 클래스에서 상위 클래스의 매서드를 재정의(override)

05.추상클래스

  • 상위클래스에서 하위 클래스에 매서드 구현을 강요 !
  • 추상클래스 쓰는 이유는 : 특정 기능을 하위클래스에서 특징에 맞게 사용할 수 있게 하기 위해
from abc import ABCMeta
from abc import abstractmethod


class AirPlane(metaclass=ABCMeta):

    @abstractmethod
    def flight(self):
        pass

    def forward(self):
        print('전진')

    def backward(self):
        print('후진')

class Airliner(AirPlane):

    def __init__(self,c):
        self.color = c

    def flight(self):
        print('시속 500')

al = Airliner('red')
al. flight()
al. backward()
al. forward()

Reference

  • 이글은 제로베이스 데이터 취업 스쿨의 강의자료 일부를 발췌하여 작성되었음.
profile
데이터와 이미지로 세상을 공부하는 중입니다 :)

0개의 댓글