Python 服务加载与选择:动态加载服务类并按需调用
import os import importlib
services_abspath_arr = [] services_arr = [] services_dir = os.getcwd() + '\services'
遍历模块文件(绝对路径)加到services_abspath_arr数组
选择服务函数
def service_select(str): for service_item in services_arr: if str.capitalize() == service_item.class.name: return service_item
def foreach_file(path_name): for root, dirs, files in os.walk(path_name): for f in files: services_abspath_arr.append(os.path.join(root, f))
读取模块
f:文件路径
def loadModule(f): # 将f变成相对路径 f = f.replace(services_dir + '', '').replace('.py', '').replace('', '/') mod = importlib.import_module( 'services.' + f.replace('/', '.') ) arr_1 = f.split('/') cs_service = getattr(mod, arr_1[len(arr_1) - 1].capitalize()) # service的class形式 service = cs_service() # print(services) services_arr.append(service)
foreach_file(services_dir) for f in services_abspath_arr: if f.find('.pyc') == -1 and f.find('init') == -1: # print(f) loadModule(f)
上面是代码的实现部分,下面是一个简单的测试例子
class UserService: def init(self): self.name = 'User Service'
class ProductService: def init(self): self.name = 'Product Service'
class OrderService: def init(self): self.name = 'Order Service'
模拟在services文件夹下有三个服务文件
分别是user_service.py, product_service.py, order_service.py
每个服务文件中有一个类,类名分别为UserService, ProductService, OrderService
每个类中有一个name属性,值分别为'User Service', 'Product Service', 'Order Service'
通过load_services函数将这三个服务加载到services_arr数组中
def load_services(): services_abspath_arr = [] services_arr = [] services_dir = os.getcwd() + '\services' foreach_file(services_dir) for f in services_abspath_arr: if f.find('.pyc') == -1 and f.find('init') == -1: loadModule(f) return services_arr
测试选择服务函数
services_arr = load_services() service = service_select('User') print(service.name) # 输出 'User Service'
service = service_select('Product') print(service.name) # 输出 'Product Service'
service = service_select('Order') print(service.name) # 输出 'Order Service'
原文地址: https://www.cveoy.top/t/topic/kU0c 著作权归作者所有。请勿转载和采集!