Я думаю, что ключом к вашему желаемому состоянию является 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 продолжается до тех пор, пока все элементы списка, поданного к нему, верны. Вы можете проверить его документацию здесь .
Используйте префикс одинарного подчеркивания:
class _Internal:
...
Это - официальная конвенция Python для 'внутренних' символов; "от импорта модуля *" не импортирует снабженные префиксом подчеркивание объекты.
Редактирование: Ссылка на конвенция
одинарного подчеркиванияКороче говоря:
Вы не можете осуществить конфиденциальность . В Python нет никаких частных классов/методов/функций. По крайней мере, не строгая конфиденциальность как на других языках, таких как Java.
можно только указать/предложить на конфиденциальность . Это следует конвенции. Конвенция Python для маркировки класса/функции/метода как частный состоит в том, чтобы снабдить его предисловием с _ (подчеркивание). Например, def _myfunc()
или class _MyClass:
. Можно также создать псевдоконфиденциальность путем снабжения предисловием метода с двумя символами нижнего подчеркивания (например: __foo
). Вы не можете получить доступ к методу непосредственно, но можно все еще назвать его через специальный префикс с помощью имени класса (например: _classname__foo
). Таким образом, лучшее, которое можно сделать, указывают/предлагают на конфиденциальность, не осуществляют его.
Python похож на жемчуг в этом отношении. Для перефразирования известной строки о конфиденциальности из книги Perl философия - то, что необходимо остаться вне гостиной, потому что Вы не были приглашены, не потому что она защищена с ружьем.
Для получения дополнительной информации:
Определите __all__
, список имен, что Вы хотите быть экспортированными ( см. документацию ).
__all__ = ['public_class'] # don't add here the 'implementation_class'
Шаблон, который я иногда использую, является этим:
Определяют класс:
class x(object):
def doThis(self):
...
def doThat(self):
...
Создают экземпляр класса, перезаписывая имя класса:
x = x()
Определяют символы, которые выставляют функциональность:
doThis = x.doThis
doThat = x.doThat
Удаляют сам экземпляр:
del x
Теперь у Вас есть модуль, который только выставляет Ваши государственные функции.
Конвенция, предварительно ожидают "_" к внутренним классам, функциям и переменным.
Для решения проблемы конвенций дизайна, и как, Christopher сказал, нет действительно никакой такой вещи как "частная" в Python. Это может звучать скрученным для кого-то происходящего из среды C/C++ (как я некоторое время назад), но в конечном счете, Вы, вероятно, поймете, что следующие конвенции - много достаточно.
Наблюдение чего-то имеющего подчеркивание впереди должно быть достаточно хорошей подсказкой для не использования его непосредственно. Если Вы обеспокоены созданием помех help(MyClass)
вывод (который является тем, на что все смотрят при поиске о том, как использовать класс), подчеркнутые атрибуты/классы не включены там, таким образом, Вы закончите тем просто, что описали свой "общедоступный" интерфейс.
Плюс, имея все общедоступное имеет его собственные потрясающие льготы, как, например, Вы можете единица тестировать в значительной степени что-либо снаружи (который Вы не можете действительно сделать с C/C++ частных конструкций).
Используйте два символа нижнего подчеркивания для добавления префикса названий "частных" идентификаторов. Для классов в модуле используйте единственный начальный символ подчеркивания, и они не будут импортированы с помощью "из импорта модуля *".
class _MyInternalClass:
def __my_private_method:
pass
(Нет такой вещи как истинный, "частный" в Python. Например, Python просто автоматически искажает имена участников класса с двойными подчеркиваниями, чтобы быть __clssname_mymember
. Таким образом, действительно, если Вы знаете скорректированное имя, можно использовать "частный" объект так или иначе. Посмотрите здесь. И конечно можно принять решение вручную импортировать "внутренние" классы, если Вы хотели к).