如何在不事先了解类的情况下填充工厂



我想创建一个泛化工厂,用于构建脚本中定义的任何类。然而,我很难找到所有的课程。

我有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'>}