Python:如何禁止从模块导入类?

10 投票
3 回答
7766 浏览
提问于 2025-04-15 18:44

我试过:

__all__ = ['SpamPublicClass']

但是,这当然只是为了:

from spammodule import *

有没有办法阻止导入一个类?我担心在我的代码的API层面上会造成混淆,可能有人会写:

from spammodule import SimilarSpamClass

这样的话,会导致调试时出现一团糟。

3 个回答

6

在Python中,其实没有办法真正阻止别人访问模块的内容,或者说类的内容也是一样。这种情况主要是靠约定来处理的,比如你可以把你的类命名为_SimilarSpamClass(前面加个下划线),这样就能告诉使用者,这个类是你模块内部的实现细节,而不是公开的接口。

如果想在Python中标记某个东西为“私有”,要好好记录你的公共接口,这样其他开发者才能正确使用你的模块。同时,遵循标准的命名约定,这样使用你模块的人就能很容易地发现自己是否偏离了你的接口,进入了你的实现部分。

7

私有类的名字最好以一个下划线开头,这样一看名字就知道这个类不是给大家用的。虽然这样做并不能真正阻止别人导入这个类,但至少可以避免意外使用。这个规则已经被大家广泛接受,名字以下划线开头的类被认为是“内部使用”的。

23

一般来说,我们会在类名前加一个下划线 _ 来表示这个类是私有的:

class PublicClass(object):
    pass

class _PrivateClass(object):
    pass

下面这段代码:

from module import *

是不会导入 _PrivateClass 的。

不过,这并不意味着他们不能导入这个类。他们还是可以明确地导入它。

from module import _PrivateClass

撰写回答