从尚未导入的类继承?

Posted

技术标签:

【中文标题】从尚未导入的类继承?【英文标题】:Inherit from a class not imported yet? 【发布时间】:2021-12-12 10:55:38 【问题描述】:

我有一个 modules.py 文件定义了几个基类。

这些基类中的一个继承自另一个模块中定义的类:

class MyClass(torch.nn.Module):
    ...

但是,我不想在那个 modules.py 文件中使用import torch,因为它是一个相当大的库,并且这个 modules.py 文件被多个进程使用,这意味着所有这些进程也将必须import torch,很快导致溢出(去过那里,做到了)。

有没有办法定义MyClass 并指定它基于torch.nn.Module 而无需import torch,让真正需要torch 模块的进程自己进行导入?因此,不需要MyClass 的其他进程可以忽略它的存在而不尝试解决它,例如?

【问题讨论】:

MyClass移动到自己的模块中,只在需要时才导入? 这个工作from torch import MyClass吗? 你不能用from torch.nm import Module 只导入需要的类而不是其他类吗? import 记住加载的模块,下一个 import torch 不应再次加载模块。 @MikeScotty 如果没有其他方法,我会这样做,但在我的情况下这不太优雅 @PCM @BR 不起作用,因为定义 Module 的文件也有一个 @ 987654333@@furas 我在这里处理多个独立的进程,所以它们不共享相同的内存空间 【参考方案1】:

有一种相当先进的方法来模拟动态导入,方法是构建一个虚拟类并导入真实模块并在第一次调用其__new__ 特殊方法时覆盖其属性。

演示:

模块 A.py:

class Attempt:
    _changed = False
    def __new__(cls, i):
        if not cls._changed:
            cls._changed = True
            import B
            for name, member in B.B.__dict__.items():
                if name not in ('__dict__', '__module__'):
                    setattr(cls, name, member)
        return object.__new__(cls)

模块 B.py:

print('importing module B')

class B:
    a = 5
    def __init__(self, i):
        self.i = i
    def __repr__(self):
        return f'B(self.i)'

你可以这样使用它:

>>> import A
>>> a = A.Attempt(2)
importing module B
>>> b = A.Attempt(3)
>>> print(a,b)
B(2) B(3)

这证明模块 B 仅在创建第一个对象时加载。

【讨论】:

相当老套但有趣的解决方法! @RobinLobel:我不建议在不考虑是否真的需要的情况下使用它,因为它确实很hacky......但它可以满足你的要求;-)

以上是关于从尚未导入的类继承?的主要内容,如果未能解决你的问题,请参考以下文章

Java类的根Object

为啥具有私有构造函数的类不阻止从此类继承?如何控制哪些类可以从某个基类继承?

面向对象编程:包,继承,多态,抽象类,接口

java包静态导入,继承

常用类 Object 字符串

在 SASS 中是不是可以从另一个文件中的类继承?