gpt4 book ai didi

python - 伪装类的真实模块

转载 作者:太空宇宙 更新时间:2023-11-03 13:24:47 25 4
gpt4 key购买 nike

假设您有以下 python 包布局

./a
./a/__init__.py
./a/_b.py

__init__.py 中你有

from _b import *

在 _b.py 中你有

class B(object): pass

如果从交互式提示导入

>>> import a
>>> a.B
<class 'a._b.B'>
>>>

我怎样才能完全隐藏 _b 的存在?

我试图解决的问题如下:我想要一个外观包导入“隐藏”模块和类。 Facade 中可用的类(在我的例子中是 a)保持稳定并为将来提供保证。但是,我想要自由地“在引擎盖下”重新定位类,因此是隐藏的模块。这一切都很好,但是如果一些客户端代码 pickle 了外观提供的对象,那么这个 pickle 数据将引用隐藏的模块嵌套,而不是外观嵌套。换句话说,如果我在模块 _c.py 中重新定位 B 类,客户端代码将无法解开,因为 pickled 类指的是 a ._b.B,已被移动。如果他们引用 a.B,我可以在后台根据需要尽可能多地重新定位 B 类,而不会破坏 pickled 数据。

最佳答案

尝试:

B.__module__= 'a'

顺便说一下,你可能想要一个绝对导入:

from a._b import *

因为没有新的显式点语法的相对导入将消失 ( see PEP 328 )。

回复评论的预计时间:

I would have to set the module explicitly for every class

是的,我认为没有办法解决这个问题,但您至少可以在 __init__ 结束时将其自动化:

for value in globals().values():
if inspect.isclass(value) and value.__module__.startswith('a.'):
value.__module__= 'a'

(仅对于新式类,您可以使用 isinstance(value, type) 而不是 inspect。如果模块不必运行 __main__ 你可以使用 __name__ 而不是硬编码 'a'。)

关于python - 伪装类的真实模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1808522/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com