데이터과학 삼학년

Abstract method (추상 메서드) 본문

Python

Abstract method (추상 메서드)

Dan-k 2020. 1. 10. 13:59
반응형

파이썬의 class를 공부하다 보면 정적메서드, 클래스메서드, 추상메서드를 볼 수 있다.

 

추상 메서드?

이것이 무엇인지 한번 알아보도록 하겠다.

 

추상메서드는 한 class를 만들때 꼭 있어야하는 method를 관리하기 위한 목적으로 사용할 수 있다.

 

쓰는 용도를 예를 들면 사람이라는 class를 만든다면, 그안에는 먹는다는 method와 일한다는 method가 꼭 있어야 한다. (일은...뭐..선택적일 수 있지만...ㅋㅋ)

 

또 다른 예는 어떤 기기를 켰을때 꼭 로고가 나오거나 소리가 나오게 해야하는 method를 만들어야한다. 이때 실수로 로고가 나오거나 소리가 나오게 하는 method를 class안에 넣지 않으면 큰(?) 일이 나게 된다.

 

이런 것을 막기 위한 용도로 추상클래스를 만들어 두고, 이 추상클래스를 실제 서비스할 클래스가 상속받게 만들어 꼭 만들어야 하는 method를 만들 수 있게 하는 일종의 체크리스트 관리같은 개념이라 보면 된다.

 

 

코드를 통해 확인해 보면

from abc import *

class HumanBase(metaclass=ABCMeta):
    @abstractmethod
    def eat(self):
        pass
    
    @abstractmethod
    def work(self):
        pass
        
 class Human(HumanBase):
    def __init__(self,name,*args):
        self.name = name
        print('나의 이름은 {}이다'.format(name))
        
    def eat(self, food):
        print('{}는 {}를 먹는다'.format(self.name,food))


a = Human('바나나')
a.eat('사과')

위 코드 처럼 abc(abstract base class)에서 metaclass=ABCMeta

를 불러와 추상클래스를 만들어 준다.

위 추상 클래스에서 선언한 두개의 eat, work 메서드가 Human class의 method에 모두 작성되지 않았으므로

아래와 같은 에러가 나타난다.

 

이것을 해결하기 위해 추상클래스에서 선언된 메서드를 모두 쓸 수 있도록 Human class의 method를 

다음과 같이 코딩해주면!!!

from abc import *

class HumanBase(metaclass=ABCMeta):
    @abstractmethod
    def eat(self):
        pass
    
    @abstractmethod
    def work(self):
        pass
        
 class Human(HumanBase):
    def __init__(self,name,*args):
        self.name = name
        print('나의 이름은 {}이다'.format(name))
        
    def eat(self, food):
        print('{}는 {}를 먹는다'.format(self.name,food))
        
    def work(self,job):
        print('{}는 {}이란 일을 한다'.format(self.name,job))
        
        
a = Human('바나나')
a.eat('사과')
a.work('프로그래머')

나의 이름은 바나나이다
바나나는 사과를 먹는다
바나나는 프로그래머이란 일을 한다

아주 자~알 실행이 된다.

프로젝트를 할 때 추상클래스를 적절히 활용해보자!!!

 

추상클래스의 method는 빈 메서드로 만들 것!!!

---> 추상 클래스는 인스턴스를 만들 수 없으니 추상 메서드도 호출할 일이 없기 때문(feat.코딩도장)

728x90
반응형
LIST

'Python' 카테고리의 다른 글

모듈, 패키지 개념 정리 (if __name__=='__main__': 쓰는 이유)  (4) 2020.03.23
OS 모듈 정리  (0) 2020.03.02
Decorator (데커레이터)  (0) 2020.01.26
Closer (클로저)  (0) 2020.01.12
파이썬 Multiprocessing  (4) 2020.01.09
Comments