“Частный” (реализация) класс в Python

Я думаю, что ключом к вашему желаемому состоянию является all встроенная функция. Поскольку вы не описали класс, из которого были созданы объекты, я использовал крошечный класс для имитации вашей ситуации:

import random
class customClass:
    def __init__(self, condition=False):
        self.condition = condition


v = [customClass() for _ in range(5)]

print([obj.condition for obj in v])
# Prints: [False, False, False, False, False]

while not all([obj.condition for obj in v]):

    #do stuff that sometimes changes the state of condition 
    # Here I randomly select an object and set its condition to true
    o = random.choice(v)
    o.condition = True

print([obj.condition for obj in v])
# Prints: [True, True, True, True, True]

Обратите внимание, что число итераций не равно 5, и цикл while продолжается до тех пор, пока все элементы списка, поданного к нему, верны. Вы можете проверить его документацию здесь .

97
задан Stephen Kennedy 11 November 2018 в 12:28
поделиться

7 ответов

Используйте префикс одинарного подчеркивания:

class _Internal:
    ...

Это - официальная конвенция Python для 'внутренних' символов; "от импорта модуля *" не импортирует снабженные префиксом подчеркивание объекты.

Редактирование: Ссылка на конвенция

одинарного подчеркивания
158
ответ дан Kiran Vemuri 24 November 2019 в 05:20
поделиться

Короче говоря:

  1. Вы не можете осуществить конфиденциальность . В Python нет никаких частных классов/методов/функций. По крайней мере, не строгая конфиденциальность как на других языках, таких как Java.

  2. можно только указать/предложить на конфиденциальность . Это следует конвенции. Конвенция Python для маркировки класса/функции/метода как частный состоит в том, чтобы снабдить его предисловием с _ (подчеркивание). Например, def _myfunc() или class _MyClass:. Можно также создать псевдоконфиденциальность путем снабжения предисловием метода с двумя символами нижнего подчеркивания (например: __foo). Вы не можете получить доступ к методу непосредственно, но можно все еще назвать его через специальный префикс с помощью имени класса (например: _classname__foo). Таким образом, лучшее, которое можно сделать, указывают/предлагают на конфиденциальность, не осуществляют его.

Python похож на жемчуг в этом отношении. Для перефразирования известной строки о конфиденциальности из книги Perl философия - то, что необходимо остаться вне гостиной, потому что Вы не были приглашены, не потому что она защищена с ружьем.

Для получения дополнительной информации:

59
ответ дан nitin3685 24 November 2019 в 05:20
поделиться

Определите __all__, список имен, что Вы хотите быть экспортированными ( см. документацию ).

__all__ = ['public_class'] # don't add here the 'implementation_class'
35
ответ дан UncleZeiv 24 November 2019 в 05:20
поделиться

Шаблон, который я иногда использую, является этим:

Определяют класс:

class x(object):
    def doThis(self):
        ...
    def doThat(self):
        ...

Создают экземпляр класса, перезаписывая имя класса:

x = x()

Определяют символы, которые выставляют функциональность:

doThis = x.doThis
doThat = x.doThat

Удаляют сам экземпляр:

del x

Теперь у Вас есть модуль, который только выставляет Ваши государственные функции.

10
ответ дан theller 24 November 2019 в 05:20
поделиться

Конвенция, предварительно ожидают "_" к внутренним классам, функциям и переменным.

8
ответ дан Benjamin Peterson 24 November 2019 в 05:20
поделиться

Для решения проблемы конвенций дизайна, и как, Christopher сказал, нет действительно никакой такой вещи как "частная" в Python. Это может звучать скрученным для кого-то происходящего из среды C/C++ (как я некоторое время назад), но в конечном счете, Вы, вероятно, поймете, что следующие конвенции - много достаточно.

Наблюдение чего-то имеющего подчеркивание впереди должно быть достаточно хорошей подсказкой для не использования его непосредственно. Если Вы обеспокоены созданием помех help(MyClass) вывод (который является тем, на что все смотрят при поиске о том, как использовать класс), подчеркнутые атрибуты/классы не включены там, таким образом, Вы закончите тем просто, что описали свой "общедоступный" интерфейс.

Плюс, имея все общедоступное имеет его собственные потрясающие льготы, как, например, Вы можете единица тестировать в значительной степени что-либо снаружи (который Вы не можете действительно сделать с C/C++ частных конструкций).

4
ответ дан Dimitri Tcaciuc 24 November 2019 в 05:20
поделиться

Используйте два символа нижнего подчеркивания для добавления префикса названий "частных" идентификаторов. Для классов в модуле используйте единственный начальный символ подчеркивания, и они не будут импортированы с помощью "из импорта модуля *".

class _MyInternalClass:
    def __my_private_method:
        pass

(Нет такой вещи как истинный, "частный" в Python. Например, Python просто автоматически искажает имена участников класса с двойными подчеркиваниями, чтобы быть __clssname_mymember. Таким образом, действительно, если Вы знаете скорректированное имя, можно использовать "частный" объект так или иначе. Посмотрите здесь. И конечно можно принять решение вручную импортировать "внутренние" классы, если Вы хотели к).

4
ответ дан chroder 24 November 2019 в 05:20
поделиться
Другие вопросы по тегам:

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