클래스 상속과 추상클래스

JHKim·2023년 10월 16일
0

Python_study_note

목록 보기
5/7

클래스 상속?

  • 클래스하위 클래스는 또 다른 클래스상위 클래스를 상속해서 내 기능처럼 사용할 수 있다.
  • 하위 클래스는 상위 클래스의 기능 외에 필요한 기능만 추가 생성해서 사용하면 편리하다.
# MyExceptionClass는 Exception 클래스를 상속함
def MyExceptionClass(Exception):

생성자

  • 객체를 생성을 위해 생성자를 호출하면 init()메소드가 자동 호출됨
  • 레퍼런스 변수를 통해 클래스와 이름이 같은 객체를 생성하면,
    - myCal = Calculator()을 통해 Calculator()를 호출,
    - Calculator.__init__():메소드를 자동 호출
  • __ init __()은 객체를 생성할 때 속성을 초기화하는 특성이 있다.
# 클래스 외부에서 객체 생성하며 속성 초기화
class Calculator:

    def __init__(self, n1, n2):
        print('Calculator called!')
        self.num1 = n1
        self.num2 = n2

myCal = Calculator(10, 20)

print(f'{myCal.num1}, {myCal.num2}')   # 초기화 됐는지 확인

# 클래스 내부에서 속성값 고정 할당, 이 경우 객체가 새로 생성될 때마다 초기화됨
class Calculator:

    def __init__(self):
        print('Calculator called!')
        self.num1 = 10
        self.num2 = 100

myCal = Calculator()

print(f'{myCal.num1}, {myCal.num2}')   # 초기화 됐는지 확인

# 섞는 것도 가능
class Calculator:

    def __init__(self, n):
        print('Calculator called!')
        self.num1 = n
        self.num2 = 50

myCal = Calculator(30)

print(f'{myCal.num1}, {myCal.num2}')
<result>
Calculator called!
10, 20
Calculator called!
10, 100
Calculator called!
30, 50

super(). 와 속성 초기화

  • 클래스를 상속한 경우, 상속받은 기능은 바로 사용할 수 있지만 상위 클래스의 속성은 하위 클래스에서 사용하는 값으로 초기화가 필요하다.
  • super(). 상속 클래스의 속성을 초기화할 때 사용
  • super().을 사용하는 경우, __ init __()안에 self 안 적음!
  • 클래스 내 함수가 여러 개라면 각 함수마다 넣어줘야 함
class C_Class(P_Class):
    def __init__(self, cNum1, cNum2):
        print('C_Class __init__ called!')

        # 방법1
        P_Class.__init__(self, cNum1, cNum2)
        # 방법2
        super().__init__(cNum1, cNum2)   # 클래스 내 def 마다 넣어줘야 함

다중 상속

  • 클래스도 2, 3, 4개 등 원하는 만큼 상속할 수 있다.
  • 클래스명 괄호 안에 나열하면 됨
  • 다중 상속 남발하면 method 명이 동일한 것 발생 가능. 헷갈림 주의
    - 원칙은 가장 하위 or () 안 가장 처음 상속받은 클래스 실행
class myCal(BasicCal, DevCal):
    def __init__(self):   
        pass

오버라이딩

  • 쉽게 말해 덮어쓰기
  • 하위 클래스에서 상위 클래스의 method를 재정의(override)하는 것
  • 하위 클래스에서 재정의할 method명을 상위 클래스와 똑같게 하면 상위 클래스의 기능을 사용하지 않음
    - 코드블럭에서 초기화super().


class TriangleArea:
    def __init__(self, n1, n2):
        self.width = n1
        self.height = n2

    def printTriangleAreaInfo(self):
        print(f'width: {self.width}')
        print(f'height: {self.height}')

    def getArea(self):
        result = self.width * self.height / 2
        return result

class NewTriangleArea(TriangleArea):
    def __init__(self, n1, n2):
        super().__init__(n1, n2)

	# 여기서 오버라이딩. 단, 연산식이 같으므로 단위만 추가(str로 캐스팅)
    def getArea(self):   
        # super()로 위로 올라가서, getArea()가져온 다음 문자열로 변환해서 더하기
        return str(super().getArea()) + '㎠' 
        
ta = NewTriangleArea(7, 5)
ta.printTriangleAreaInfo()
triangleArea = ta.getArea()
print(f'TriangleArea: {triangleArea}')
<result>
width: 7
height: 5
TriangleArea: 17.5

추상클래스

  • 공통적인 클래스를 상속받지만 하위 클래스에 따라 값이 달라져야 하는 경우가 있음
  • 상위 클래스에서 하위 클래스에다가 method 구현을 강요할 때 사용
  • 구현 안 하면 에러남
  • 다음 입력 필수
from abc import ABCMeta
from abc import abstractmethod

# 추상클래스에 metaclass=ABCMeta 삽입
#예를 들어,  
class AirPlane(metaclass=ABCMeta):

# 강요하고자 하는 메소드에 @abstractmethod를 붙임
	@abstractmethod
    def flightSpeed():   #클래스를 상속받긴 하지만, 각각 알아서 써야 하는 경우 발생
    	pass

0개의 댓글