javaや、javascript , perl ,php 等と、 python における package , module , class や、import , class継承 は 実装方法が異なる為、メモ。というか、練習。
ポイントは、init.py における 各moduleのimportと、一括new。
dir構成
caller.py package/ __init__.py base_module.py module_a.py module_b.py
各fileの内容
継承関係は、各file内容で確認して下さい
caller.py
#!python # -*- coding: utf-8 -*- import os import sys sys.path.append( os.path.dirname(__file__) ) import package def main(): # print(sys.path) print( package.sub_classes['Class1inModuleA'].hoge() ) print( package.sub_classes['Class1inModuleB'].hoge() ) if __name__ == '__main__': main()
package/init.py
import glob import inspect import os import sys sys.path.append( os.path.dirname(__file__) ) # refer to https://qiita.com/suzuki-kei/items/8fea67655abf216a5013 # __all__ = [ # os.path.split(os.path.splitext(file)[0])[1] # for file in glob.glob(os.path.join(os.path.dirname(__file__), '[a-zA-Z0-9]*.py')) # ] import base_module import module_a import module_b sub_classes = {} modules_tmp = [module_a, module_b] for module_tmp in modules_tmp: sub_classes_tmp = inspect.getmembers(module_tmp, inspect.isclass) for sub_class_tmp in sub_classes_tmp: sub_class_name = sub_class_tmp[0] sub_class = sub_class_tmp[1]() sub_classes[ sub_class_name ] = sub_class
package/base_module.py
import sys class BaseClass(): def hoge(self): class_name = self.__class__.__name__ func_name = sys._getframe().f_code.co_name return " ".join(["classname & func name =", class_name,"&",func_name])
package/module_a.py
import sys class Class1inModuleA(): def hoge(self): class_name = self.__class__.__name__ func_name = sys._getframe().f_code.co_name return " ".join(["classname & func name =", class_name,"&",func_name])
package/module_b.py
import base_module class Class1inModuleB(base_module.BaseClass): pass
上記の実行結果
正しく継承できていることが分かります。
..\python38\python.exe .\caller.py classname & func name = Class1inModuleA & hoge classname & func name = Class1inModuleB & hoge