当有比较大量的对象需要各自实现各自类别的对象化,而且他们的对象化类在同一个目录下,如何根据名称的映射实现统一的对象化。
如下,将Fruit类的对象映射为各自的水果类,在objecting_model文件中进行调用实现实例化。
目录如下:
objection_config.py文件
import importlib
from collections import defaultdict
class Fruit_Config():
MODULE_PATH = "objection.objection_files."
FRUIT_CONFIG_DICT = {
"苹果": [("apple", "Apple")],
"桃子": [("peach", "Peach")],
"梨": [("pear", "Pear")],
}
def import_object_config(config_dict,module_path,debug_dict):
result_dict = defaultdict(list)
for name, file_list in config_dict.items():
if isinstance(file_list, tuple):
file_list = [file_list]
if debug_dict and name not in debug_dict:
continue
for file_name, class_name in file_list:
module_full_path = module_path + file_name
try:
module = importlib.import_module(module_full_path)
fruit_class = getattr(module, class_name)
except (ModuleNotFoundError, AttributeError) as e:
print('objection___{}nofoundModule----'.format(name))
else:
result_dict[name].append(fruit_class)
return result_dict
objecting_model.py文件
from objection.Fruit import Fruit
from objection.objection_config import *
apple1 = Fruit(['苹果','梨'],'red', 78, "江西")
apple2 = Fruit(['苹果','梨'],'red', 78, "江西")
peach = Fruit(["桃子",], "pink", 980,)
fruit_list = [apple1, apple2, peach]
debug_dict = {}
fruit_dict = defaultdict(list)
fruit_config = import_object_config(Fruit_Config.FRUIT_CONFIG_DICT, Fruit_Config.MODULE_PATH,debug_dict)
for i in fruit_list:
for name in i.name_list:
fruit_class_list = fruit_config.get(name, [])
for fruit_class in fruit_class_list:
fruit = fruit_class(i)
fruit_dict[fruit.chinese_name].append(fruit)
print(fruit_dict)
Fruit.py文件
class Fruit():
def __init__(self,
name_list: [str],
color: str = None,
count: int = 0,
location: str = ''
):
self.name_list = name_list
self.color = color
self.count = count
self.location = location