自动生成Python类工厂并保存到__init__.py文件中,可以通过反射和元类实现。
代码示例:
# 定义元类
class FactoryMetaClass(type):
def __init__(cls, name, bases, attrs):
super().__init__(name, bases, attrs)
# 检查类是否有工厂方法并获取工厂方法名
factory_method = attrs.get("factory_method")
if factory_method:
# 获取类名并去掉开头的下划线
class_name = name.lstrip("_")
# 将类名和工厂方法名添加到注册表中
registry[class_name] = factory_method
# 定义注册表
registry = {}
# 通过反射自动生成类工厂并保存到__init__.py文件中
import sys
import inspect
import importlib
current_module = sys.modules[__name__]
for name, factory_method in registry.items():
# 定义类名并创建类
class_name = name.capitalize()
cls = FactoryMetaClass(class_name, (), {})
# 定义工厂方法并添加到类中
def factory(self, *args, **kwargs):
return cls(*args, **kwargs)
setattr(cls, factory_method.__name__, factory)
# 将类添加到当前模块中
setattr(current_module, class_name, cls)
# 调用工厂方法创建类实例
Foo = current_module.Foo.factory()
foo = Foo()
此时,编写一个工厂方法并将其添加到类中,就能自动生成该类的工厂并自动保存到__init__.py文件中。工厂方法需要返回一个实例化的类对象。最后,通过工厂方法创建类实例。