Abstract Base Class

codakcodak·2023년 10월 29일
0

OOP python

목록 보기
18/19
post-thumbnail
post-custom-banner

추상 클래스

  • 추상클래스가 하나 이상 포함된 클래스
  • 객체지향프로그래밍에서 다형성을 부여하는 중요한 문법이다.

추상 메서드

  • 구현이 없이 선언만 되어 있는 메서드(pass or ...)
  • 추상 메서드는 자식 클래스에서 반드시 구현(추상 클래스가 추상클래스를 상속한다면 반드시 구현할 필요는 없다)
  • 추상 메서드를 사용하여 공통된 메서드를 강제할 수 있다.

abc

  • Abstract Base Class로서 추상화를 도와주는 파이썬의 모듈이다.

abc의 성질

* ABC를 상속받은 클래스에 abstractmethod에 의한 추상 메서드가 하나 이상 있다면 이는 추상 클래스가 되고 인스턴스화가 불가능해진다.

from abc import ABC, abstractmethod


class standable(ABC):
	#아래의 추상메서드가 사라진다면 인스턴스화가 가능하다.
    @abstractmethod
    def stand(self):
        pass


stand = standable()
TypeError: Can't instantiate abstract class standable with abstract method stand

* 추상클래스를 상속받은 클래스는 반드시 추상메서드를 구현해야 한다.

from abc import ABC, abstractmethod


class standable(ABC):
    @abstractmethod
    def stand(self):
        pass


class Person(standable):
    def sit(self):
        print("sit")


person = Person()
TypeError: Can't instantiate abstract class Person with abstract method stand

* ABC모듈은 runtime 단계에서 에러를 raise할 수 있지만 컴파일 단계(mypy 또는 pyright를 통한 typecheck 단계)에서도 가능하다.

mypy ABC.py  
ABC.py:15: error: Cannot instantiate abstract class "Person" with abstract attribute "stand"  [abstract]
Found 1 error in 1 file (checked 1 source file)

* 추상 클래스는 추상클래스를 상속할 수 있다.

from abc import ABC, abstractmethod


class standable(ABC):
    @abstractmethod
    def stand(self):
        pass


class initiatable(standable):
    def __init__(self, name: str):
        self.name = name


class Person(initiatable):
    # Override
    def stand(self):
        print("stand")

    def my_name(self):
        print("im " + self.name)


person = Person("steve")
person.stand()
person.my_name()
stand
im steve

* 컴파일 단계에서 추상클래스의 자료형으로 type check를 할 수 있다.

from abc import ABC, abstractmethod


class standable(ABC):
    @abstractmethod
    def stand(self):
        pass


class Person(standable):
    def stand(self):
        print("stand")

    def sit(self):
        print("sit")

    def run(self):
        print("run")


person: standable = Person()
#선언한 자료형은 standable이기때문에 sit메서드가 없어 타입체크시 에러가 난다.
person.sit()
ABC.py:22: error: "standable" has no attribute "sit" 
profile
숲을 보는 코더
post-custom-banner

0개의 댓글