从尚未导入的类继承?
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......但它可以满足你的要求;-)以上是关于从尚未导入的类继承?的主要内容,如果未能解决你的问题,请参考以下文章