Python: Как я запрещаю импорт класса от модуля?

Я попробовал:

__all__ = ['SpamPublicClass']

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

from spammodule import *

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

from spammodule import SimilarSpamClass

и это вызовет отладку погрома.

5
задан orokusaki 1 February 2010 в 15:37
поделиться

3 ответа

Китайская теорема об остатках приходит на ум как начальная точка как 221 = 13 * 17. Итак, разбейте это на 2 частей, которые объединяются в конце, одна для mod 13 и одна для mod 17. Во-вторых, я полагаю, что есть некоторое доказательство ^ (p-1) = 1 mod p для всех ненулевых а, который также помогает уменьшить вашу проблему, как 5 ^ 55 становится 5 ^ 3 для mod 13 case как 13 * 4 = 52. Если вы посмотрите на тему «Конечные поля», вы можете найти хорошие результаты о том, как решить это.

EDIT: Причина, по которой я упоминаю факторы, заключается в том, что это создает способ фактор ноль в ненулевых элементов, как если бы вы пытались что-то вроде 13 ^ 2 * 17 ^ 4 mod 221, ответ равен нулю, так как 13 * 17 = 221. Много больших чисел не собирается быть простым, хотя есть способы найти большие простые числа, как они много используются в криптографии и других областях в математике.

-121--905648-

Для такого планирования часто используются генетические алгоритмы.

Найден этот пример (Составление расписания классов с использованием генетического алгоритма) , который вполне соответствует вашим требованиям.

-121--799789-

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

class PublicClass(object):
    pass

class _PrivateClass(object):
    pass

Следующее:

from module import *

Не будет импортировать _PrivateClass.

Но это не помешает им импортировать его. Они по-прежнему могут импортировать его явным образом.

from module import _PrivateClass
12
ответ дан 18 December 2019 в 06:50
поделиться

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

6
ответ дан 18 December 2019 в 06:50
поделиться

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

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

5
ответ дан 18 December 2019 в 06:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: