我可以建立一个自动类工厂,在进口工作?

2024-04-26 22:11:15 发布

您现在位置:Python中文网/ 问答频道 /正文

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

from myproject.myfactory.virtualmodule import Foo

“myfactory”在项目中是一个真正的模块,但我希望virtualmodule是一个假装是模块的东西。你知道吗

每当我从virtualmodule导入一些东西时,我都希望它使用我的factory方法构建一个新类,并使它看起来像是导入的一样。你知道吗

这能做到吗?是否有一种模式允许我将类工厂包装为一个模块?你知道吗

谢谢!你知道吗

---

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

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

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


Tags: 模块方法fromimport名称网格参数节点
1条回答
网友
1楼 · 发布于 2024-04-26 22:11:15

可以将任意对象填充到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对象。你知道吗

相关问题 更多 >