【问题标题】:Override the "from <my_object> import <name>" functionality?覆盖“从 <my_object> 导入 <name>”功能?
【发布时间】:2018-08-01 15:20:59
【问题描述】:
假设我有一个自定义类和它的一个实例:
class Container:
def __init__(self):
self._modules = {}
container = Container()
是否可以覆盖 from X import Y 功能,以便我可以执行以下操作:
>>> container._modules['foo'] = 'bar'
>>> from container import foo
>>> foo
'bar'
【问题讨论】:
标签:
python
python-3.x
overriding
python-import
【解决方案1】:
有一些使用导入钩子的解决方案,在PEP 302 中定义(类似问题:https://stackoverflow.com/a/3074701/5764588),但这里有一个解决方案覆盖内置的__import__-function 与一个检查本地命名空间的@ 987654324@from x import y:
不过,我不建议在任何实际场景中使用它,因为它很hackish,因为它插入了python的核心功能,并且可能会产生一些令人困惑的代码,例如,当你有一个同名的模块时作为局部变量。不过,您的用例可能是有效的,在这种情况下,别有用心!
class Container:
def __init__(self):
self._modules = {}
def __getattr__(self, name):
if name in self._modules:
return self._modules[name]
return super().__getattr__(name)
container = Container()
container._modules["foo"] = "bar"
prev_import = __import__
def new_import(name, globals=None, locals=None, fromlist=(), level=0):
if level == 0 and fromlist and name in locals:
return locals[name]
return prev_import(name, globals, locals, fromlist, level)
__builtins__.__import__ = new_import
from container import foo
print(foo)