2010-02-01 26 views
3

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

__all__ = ['SpamPublicClass'] 

但是,当然,这只是为:

from spammodule import * 

有没有办法来阻止一类的进口。我担心有人会写我的代码的API级别混淆:

from spammodule import SimilarSpamClass 

它会引起调试混乱。

+4

“我很担心混乱......”我将重点放在明确的文档而不是“预防”上。他们可以阅读来源。他们可以绕过你放置的任何东西。我认为一盎司明确的文件击败了一英镑的“阻塞”企图。 – 2010-02-01 15:58:31

回答

10

的约定是使用_作为前缀:

class PublicClass(object): 
    pass 

class _PrivateClass(object): 
    pass 

以下:

from module import * 

不会导入_PrivateClass。

但这并不妨碍他们导入它。他们仍然可以明确导入它。

from module import _PrivateClass 
+0

谢谢。这有帮助。另一个问题是我从模块B导入一个类到模块A(我不希望模块A的用户访问,但它是因为从模块B导入它后立即可用。 – orokusaki 2010-02-01 16:42:36

+0

我想我可以导入它从'moduleb将SpamClass导入为_SpamClass' – orokusaki 2010-02-01 16:43:38

6

使用和下划线开始私有类的名称,以便通过名称明确它不是供公众使用的。这实际上不会阻止任何人进口课程,但它不应该是偶然发生的。从下划线开始的名称是“内部的”,这是一个完善的惯例。

5

没有办法真正阻止访问模块的内容,或在Python此事一类的内容。 这种事情是按照惯例命名您的类_SimilarSpamClass(带领先的下划线)以向调用者表明这是您的模块的实现细节,而不是已发布的API的一部分。

为了纪念什么是“私人”在Python 正确记录你的公共API因此其他开发人员知道如何正确使用你的模块和按照标准naming conventions因此,当他们已经从偏离你的模块的用户很容易发现你的API到你的实现。