LoginSignup
2
6

More than 5 years have passed since last update.

pythonで仮想関数を作る

Posted at

pythonで仮想関数を作る

手順の概要
1 クラスを作る
2 abcを使う
3 abstract methodのマークをつける

クラスを作る

まずは、いわゆる継承関係のクラスを作成します。
MyClassAbstractを継承した、MyClassを作成

継承.png

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

という動きになりました。

2
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
6