我可以构建一个可以导入的自动类工厂吗?

时间:2013-07-24 15:15:59

标签: python

我有一个生产类的类工厂F.除了名称之外,它不需要任何参数。我希望能够包装这个方法并像这样使用它:

from myproject.myfactory.virtualmodule import Foo

“myfactory”是项目中的一个真实模块,但我希望虚拟模块能够成为一个假装成模块的东西。

每当我从virtualmodule导入一些内容时,我希望它使用我的工厂方法构建一个新类,并使其看起来好像是导入的。

可以这样做吗?是否有一种模式允许我将类工厂包装为模块?

谢谢!

-

UPDATE0:我为什么需要这个?它实际上是测试一个将在网格上运行的进程,该进程要求所有类都是可导入的。

自动生成的类的实例将在我的PC上序列化,然后在每个网格节点上反序列化。如果无法在网格节点上导入类,则unserialize将失败。

如果我劫持导入机制作为制作测试类的接口,那么我肯定知道我可以在PC上导入的任何内容都可以在网格上重新创建完全相同的内容。这将满足我的测试要求。

1 个答案:

答案 0 :(得分:3)

您可以将任意对象填充到sys.modules结构中:

import sys

class VirtualModule(object):
    def __init__(self, name):
        self.__name__ = name.rsplit('.', 1)[-1]
        self.__package__ = name
        self.__loader__ = None

    def __getattr__(self, name):
        if name is valid:
            # Return dynamic classes here
            return VirtualClass(name)

        raise AttributeError(name)


virtual_module_name = 'myproject.myfactory.virtualmodule'
sys.modules[virtual_module_name] = VirtualModule(virtual_module_name)

Python导入机制将使用属性访问查找对象,触发__getattr__实例上的VirtualModule方法。

myproject/__init__.pymyproject/myfactory/__init__.py文件中执行此操作,您就可以了。确实需要存在myproject.myfactory包,导入机制才能找到myproject.myfactory.virtualmodule对象。