2

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

from myproject.myfactory.virtualmodule import Foo

“myfactory”是项目中的一个真实模块,但我希望 virtualmodule 成为一个伪装成模块的东西。

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

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

谢谢!

--

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

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

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

4

1 回答 1

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__.pyormyproject/myfactory/__init__.py文件中执行此操作,您就可以开始了。包myproject.myfactory确实需要存在才能让导入机制找到myproject.myfactory.virtualmodule对象。

于 2013-07-24T20:43:22.693 回答