我想创建一个泛化工厂,用于构建脚本中定义的任何类。然而,我很难找到所有的课程。
我有factory.py
:
import sys
import inspect
def imports():
for name, val in globals().items():
if isinstance(val, types.ModuleType):
yield val.__name__
def classes():
for mod in [sys.modules[__name__]] + [imports()]:
for name, obj in inspect.getmembers(mod):
if inspect.isclass(obj):
yield obj
class Factory:
factory_dict = {}
def __init__(self):
for xx in classes():
factory_dict[xx.__name__] = xx
print(xx.__name__)
我在myclasses.py
中定义了一些类
class A:...
class B:...
我有我的scratch.py
:
import factory
import myclasses
class foo:...
ff = factory.Factory()
结果是:
/Users/raysalemi/.conda/envs/untitled/bin/python scratch.py"
Factory
generator
我看不到myclasses.py
中定义的类或scratch.py
中定义的类别。很明显,工厂只在自己的模块中看到什么。
有没有一种方法可以创建一个可以访问所有当前定义的类的工厂?
事实证明,这里的解决方案不是检查脚本并找到类,而是让类在定义时将自己添加到factory_dict
中。
上面的变化是这样的:
factory.py
现在定义了一个元类来填充dict:
class Factory:
factory_dict = {}
class factory_class(type):
def __init__(cls, name, bases, clsdict):
Factory.factory_dict[cls.__name__] = cls
super().__init__(name, bases, clsdict)
class factory_base(metaclass=factory_class):
pass
想要在工厂中可用的类扩展factory_base
:
from factory import factory_base
class A(factory_base):...
class B(factory_base):...
结果是scratch.py
:中的代码更简单
import factory
import myclasses
class foo:...
ff = factory.Factory()
print(factory.Factory.factory_dict)
具有此输出:
/python scratch.py"
{'factory_base': <class 'factory.factory_base'>, 'A': <class 'myclasses.A'>, 'B': <class 'myclasses.B'>}