Python:如何禁止从模块中导入类?
Posted
技术标签:
【中文标题】Python:如何禁止从模块中导入类?【英文标题】:Python: How do I disallow imports of a class from a module? 【发布时间】:2011-01-11 18:41:15 【问题描述】:我试过了:
__all__ = ['SpamPublicClass']
但是,这当然只是为了:
from spammodule import *
有没有办法阻止类的导入。我担心有人会在我的代码的 API 级别上造成混淆:
from spammodule import SimilarSpamClass
这会导致调试混乱。
【问题讨论】:
“我担心混淆......” 我会专注于清晰的文档而不是“预防”。他们可以阅读源代码。他们可以绕过你放置的任何东西。我认为一盎司清晰的文档胜过一磅试图“阻止”的尝试。 【参考方案1】:约定是使用 _ 作为前缀:
class PublicClass(object):
pass
class _PrivateClass(object):
pass
以下内容:
from module import *
不会导入 _PrivateClass。
但这不会阻止他们导入它。他们仍然可以显式导入它。
from module import _PrivateClass
【讨论】:
谢谢。这有帮助。另一个问题是我也将一个类从模块 B 导入到模块 A 中(我不希望模块 A 的用户访问,但因为从模块 B 导入它时立即可用。 我想我可以将其导入为from moduleb import SpamClass as _SpamClass
【参考方案2】:
私有类的名称以和下划线开头,以便仅通过名称就可以清楚地表明它不是供公共使用的。这实际上不会阻止任何人导入该类,但这不应该是偶然发生的。下划线开头的名称是“内部”的,这是一个公认的约定。
【讨论】:
这是在 Python 中的操作方法。 Python 是故意设计成具有“同意的成年人”的开发理念。如果有人想导入SimilarSpamClass
或 _SimilarSpamClass
,他们可以,但需要注意的是您警告过他们。【参考方案3】:
在 Python 中没有办法真正阻止对模块内容或类内容的访问。 这类事情按惯例处理 将您的类命名为 _SimilarSpamClass
(带有前导下划线)以向调用者表明这是您的模块的实现细节,而不是已发布 API 的一部分。 p>
在 Python 中将某些内容标记为“私有”正确记录您的公共 API,以便其他开发人员知道如何正确使用您的模块并遵循标准 naming conventions,以便当您的 API 偏离您的实现时,您模块的用户很容易注意到他们。
【讨论】:
以上是关于Python:如何禁止从模块中导入类?的主要内容,如果未能解决你的问题,请参考以下文章