pythonで仮想関数を作る
手順の概要
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
という動きになりました。