Python: Как мне запретить импорт класса из модуля? - PullRequest
5 голосов
/ 01 февраля 2010

Я пытался:

__all__ = ['SpamPublicClass']

Но, конечно, это только для:

from spammodule import *

Есть ли способ заблокировать импорт класса. Я обеспокоен путаницей на уровне API моего кода, который кто-то напишет:

from spammodule import SimilarSpamClass

и это вызовет отладку хаоса.

Ответы [ 3 ]

11 голосов
/ 01 февраля 2010

Соглашение заключается в использовании _ в качестве префикса:

class PublicClass(object):
    pass

class _PrivateClass(object):
    pass

Следующее:

from module import *

Не импортирует _PrivateClass.

Но это не помешает им импортировать его. Они все еще могут импортировать его явно.

from module import _PrivateClass
6 голосов
/ 01 февраля 2010

Начинайте имена частных классов с подчеркивания, чтобы по нему было ясно, что оно не для публичного использования. На самом деле это никому не помешает импортировать класс, но это не должно происходить случайно. Хорошо известно, что имена, начинающиеся с подчеркивания, являются «внутренними».

5 голосов
/ 01 февраля 2010

Нет способа заблокировать доступ к содержимому модуля или содержимому класса в этом отношении в Python. Подобные вещи обрабатываются соглашением Назовите ваш класс _SimilarSpamClass (с начальным подчеркиванием), чтобы указать вызывающим абонентам, что это деталь реализации вашего модуля, а не часть опубликованного API.

Чтобы пометить что-то как "приватное" в Python правильно задокументируйте ваш публичный API , чтобы другие разработчики знали, как правильно использовать ваш модуль, и следовали стандартным соглашениям об именах так что пользователи вашего модуля легко заметят, когда они отклонились от вашего API для вашей реализации.

...