end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

python における package , module , class や、import , class継承

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