89 lines
3.3 KiB
Python
89 lines
3.3 KiB
Python
|
|
from abc import ABC, abstractmethod
|
|||
|
|
import importlib
|
|||
|
|
|
|||
|
|
|
|||
|
|
# 定制空的抽象工厂、根据后面逻辑对抽象工厂中装入实体工厂
|
|||
|
|
class AbstractFactory(ABC):
|
|||
|
|
# 动态加载函数并绑定到类
|
|||
|
|
@classmethod
|
|||
|
|
def add_function_to_class(cls, packages_name, modules_name, function_name):
|
|||
|
|
"""
|
|||
|
|
动态加载模块中的函数并绑定到类
|
|||
|
|
:param packages_name: 包名称
|
|||
|
|
:param modules_name: 模块名称,例如 "functions"
|
|||
|
|
:param function_name: 函数名称,例如 "greet"
|
|||
|
|
:param cls: 要绑定函数的类
|
|||
|
|
"""
|
|||
|
|
# 动态加载模块
|
|||
|
|
modules_path = f"{packages_name}.{modules_name}"
|
|||
|
|
modules = importlib.import_module(modules_path)
|
|||
|
|
# 获取函数
|
|||
|
|
func = getattr(modules, function_name)
|
|||
|
|
# 将函数绑定到类
|
|||
|
|
setattr(cls, function_name, func)
|
|||
|
|
|
|||
|
|
@classmethod
|
|||
|
|
def add_field_to_class(cls, data):
|
|||
|
|
print(data)
|
|||
|
|
for k, v in data.items():
|
|||
|
|
setattr(cls, k, v)
|
|||
|
|
|
|||
|
|
@classmethod
|
|||
|
|
def generate_class_code(cls):
|
|||
|
|
# 类定义行
|
|||
|
|
class_code = f"class {cls.__name__}({', '.join(base.__name__ for base in cls.__bases__)}):\n"
|
|||
|
|
|
|||
|
|
# 遍历类的属性和方法
|
|||
|
|
for name, value in cls.__dict__.items():
|
|||
|
|
if not name.startswith('__'): # 忽略特殊方法
|
|||
|
|
if callable(value): # 如果是方法
|
|||
|
|
method_code = f" def {name}(self):\n"
|
|||
|
|
method_code += f" return {repr(value(None))}\n" # 简单示例,实际需要解析方法体
|
|||
|
|
class_code += method_code
|
|||
|
|
else: # 如果是属性
|
|||
|
|
class_code += f" {name} = {repr(value)}\n"
|
|||
|
|
|
|||
|
|
return class_code
|
|||
|
|
|
|||
|
|
|
|||
|
|
class AbstractProduce(ABC):
|
|||
|
|
# 动态加载函数并绑定到类
|
|||
|
|
@classmethod
|
|||
|
|
def add_function_to_class(cls, packages_name, modules_name, function_name):
|
|||
|
|
"""
|
|||
|
|
动态加载模块中的函数并绑定到类
|
|||
|
|
:param packages_name: 包名称
|
|||
|
|
:param modules_name: 模块名称,例如 "functions"
|
|||
|
|
:param function_name: 函数名称,例如 "greet"
|
|||
|
|
:param cls: 要绑定函数的类
|
|||
|
|
"""
|
|||
|
|
# 动态加载模块
|
|||
|
|
modules_path = f"{packages_name}.{modules_name}"
|
|||
|
|
modules = importlib.import_module(modules_path)
|
|||
|
|
# 获取函数
|
|||
|
|
func = getattr(modules, function_name)
|
|||
|
|
# 将函数绑定到类
|
|||
|
|
setattr(cls, function_name, func)
|
|||
|
|
|
|||
|
|
@classmethod
|
|||
|
|
def add_field_to_class(cls, data):
|
|||
|
|
for k, v in data.items():
|
|||
|
|
setattr(cls, k, v)
|
|||
|
|
|
|||
|
|
@classmethod
|
|||
|
|
def generate_class_code(cls):
|
|||
|
|
# 类定义行
|
|||
|
|
class_code = f"class {cls.__name__}({', '.join(base.__name__ for base in cls.__bases__)}):\n"
|
|||
|
|
|
|||
|
|
# 遍历类的属性和方法
|
|||
|
|
for name, value in cls.__dict__.items():
|
|||
|
|
if not name.startswith('__'): # 忽略特殊方法
|
|||
|
|
if callable(value): # 如果是方法
|
|||
|
|
method_code = f" def {name}(self):\n"
|
|||
|
|
method_code += f" return {repr(value(None))}\n" # 简单示例,实际需要解析方法体
|
|||
|
|
class_code += method_code
|
|||
|
|
else: # 如果是属性
|
|||
|
|
class_code += f" {name} = {repr(value)}\n"
|
|||
|
|
|
|||
|
|
return class_code
|