我创建了一个如下所示的Python模块文件:
from abc import ABC, abstractmethod
class Engine(ABC):
# Rest of class
这会给我的模块用户带来不必要的副作用:
import my_module
class SomeClass(my_module.ABC): # Use ABC from my_module!
# Rest of class
有没有办法阻止用户从我的模块访问ABC
和abstractmethod
?我能想到的唯一方法是将我的文件结构更改为像这样的东西:
--my_module/
----__init__.py
----engine.py
然后在__init__.py
做from engine import {everything but ABC etc.}
。当然,这实际上并不能解决问题本身,因为用户仍然可以my_module.engine.ABC
。
答案 0 :(得分:2)
我见过的典型方法是做这样的事情:
engine.py
:
from abc import ABC, abstractmethod
__all__ = ['Engine']
class Engine(ABC):
# Rest of class
del ABC
del abstractmethod
__init__.py
from engine import *
我见过的大多数项目都没有费心去清理导入的全局变量,因为__all__
使用导入所有内容的__init__.py
不会暴露它们。但是,这样做并没有错。
如果您没有清理它们,用户能够看到它们的唯一方法是它们是否绕过您的模块并直接从您的子模块导入这些对象。
答案 1 :(得分:2)
我认为关键问题是您需要限制开发人员?
由于python假设开发人员足够聪明以处理有关模块访问和命名空间的安全问题,因此它没有提供任何可靠的方法来限制访问。
为什么您需要限制人员访问ABC
模块?如果您担心可能由from xxx import *
引起的变量覆盖。您只需使用__all__ = [...]
指定要导出的内容。
requests
是一个结构非常好的图书馆,但它仍然没有对不必要的限制访问做出任何努力。