天天看點

python反射應用(調用方法和類中方法)——————附帶詳細執行個體

文章目錄

  • ​​0 結果​​
  • ​​1 調用方法​​
  • ​​2 調用類中的方法​​
  • ​​3 調用測試的代碼​​

0 結果

檔案目錄:

python反射應用(調用方法和類中方法)——————附帶詳細執行個體

調用方法:

executeModel2("model.testModel2", [1, 2])      

調用類中的方法:

executeModel("model.add", [1, 2])      

優點:

  • 自動引包;
  • 類名和方法名通過參數傳入來調用;

1 調用方法

方法:

def executeModel2(config, input):
    model, func = config.strip().split(".")
    module = __import__(f"lib.{model}", fromlist=True)
    if hasattr(module, func):
        func = getattr(module, func)
        func(input)
    else:
        print("模型不存在!")      

調用測試:

executeModel2("model.testModel2", [1, 2])      

解釋:

  • ​__import__(f"lib.{model}", fromlist=True)​

    ​​相當于​

    ​import lib.model​

    ​;
  • ​hasattr​

    ​:判斷對象是否存在某個方法;
  • ​getattr​

    ​:傳回對象指定屬性的值;

2 調用類中的方法

方法:

def executeModel(config, input):
    model, func = config.strip().split(".")
    model_class_name = str.upper(model[0]) + model[1:len(model)]
    module = __import__(f"lib.{model}", fromlist=[model_class_name])
    import inspect
    for obj_name, obj in inspect.getmembers(module):
        if inspect.isclass(obj): # 執行個體化對象
            print(obj_name, obj)
            if obj_name == model_class_name + 'Input':
                model_input = obj(*input)
            elif obj_name == model_class_name:
                model_class = obj("測試反射模型")
            else:
                pass
    # 調用對象中方法
    model_method = getattr(model_class, func)
    model_method(model_input)      
executeModel("model.add", [1, 2])      

3 調用測試的代碼

class ModelInput:
    def __init__(self, num1, num2):
        self._num1 = num1
        self._num2 = num2

    @property
    def num1(self):
        return self._num1

    @property
    def num2(self):
        return self._num2

class Model:
    def __init__(self, model_info):
        self._model_info = model_info

    def add(self, input):
        res = input.num1 + input.num2
        print(f"{self._model_info}:{res}")

def testModel2(params=list()):
    print(params)