파이썬으로 가상 함수 만들기

7417 단어 python2.7

파이썬으로 가상 함수 만들기



절차 개요
1 수업 만들기
2 abc 사용
3 abstract method 표시

수업 만들기



우선, 이른바 상속 관계의 클래스를 작성합니다.
MyClassAbstract를 상속받은 MyClass 만들기



sample_method가 있는 클래스

abstract.py
#coding: UTF-8

class MyClassAbstract(object):
    '''
    classdocs
    '''
    def __init__(self):
        '''
        Constructor
        '''
        pass
    def sample_method(self):
        pass

MyClassAbstract를 상속하는 클래스 만들기
이 시점에서 가상 함수를 만들지 않았기 때문에,
sample_method를 구현하지 않아도 오류가 발생하지 않습니다.

hontai.py
from abstract import MyClassAbstract

class MyClass(MyClassAbstract):
    def hontai_method(self):
        print("Hontai")
    pass



main 함수에서 MyClass의 sample_method()를 호출해 보자.

main.py
from hontai import MyClass

if __name__ == '__main__':
    MyClass().sample_method()

실행 결과
abstract

MyClassAbstract의 sample_method를 가상 함수로 만듭니다.



MyClassAbstract의 sample_method를 가상 함수로 만듭니다.
변경 개소는 3 개소
- abc에서 ABCMeta 및 abstract method 가져 오기
- metaclass에 ABCMeta 설정
- 추상화하고 싶은 클래스의 직전에 [ @abstractmethod ]를 부여

abstract.py
#coding: UTF-8
from abc import ABCMeta, abstractmethod # 変更

class MyClassAbstract(object):
    '''
    classdocs
    '''
    __metaclass__ = ABCMeta # 変更

    def __init__(self):
        '''
        Constructor
        '''
        pass

    # 抽象メソッド
    @abstractmethod # 変更
    def sample_method(self):
        print("abstract")

이대로 main 함수를 재실행해 본다.

실행 결과
Traceback (most recent call last):
  File "/Users/shibatanorihiro/Documents/workspace/testprj/src/main.py", line 4, in <module>
    MyClass().sample_method()
TypeError: Can't instantiate abstract class MyClass with abstract methods sample_method

상속 대상이 가상 함수를 구현하지 않으면 오류가 출력됩니다.

동작 검증



MyClass 측에 sample_method를 구현합니다.

bontai.py
from abstract import MyClassAbstract

class MyClass(MyClassAbstract):
    def hontai_method(self):
        self.sample_method()
        print("Hontai")
    pass

    def sample_method(self):                 #追加
        super(MyClass, self).sample_method() #追加
        print("Hontai sample")               #追加
    pass

main.py
from hontai import MyClass

if __name__ == '__main__':
    MyClass().hontai_method() #hontai_methodを呼ぶようにする

실행 결과
abstract
Hontai sample
Hontai

예상대로,
main
 -> MyClass.hontai_method
  ->MyClass.sample_method
   ->MyClassAbstract.sample_method

라는 움직임이 되었습니다.

좋은 웹페이지 즐겨찾기