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:如何禁止从模块中导入类?的主要内容,如果未能解决你的问题,请参考以下文章

如何禁用模块中导入类的自动linting?

Typescript:如何从 javascript 文件中导入类?

如何在同一目录或子目录中导入类?

无法加载模块脚本 - 在 index.html 中导入类

java如何在指定目录中导入类

尝试在 Jasmine 规范文件中导入类时出现“语法错误:无法在模块外使用导入语句”