ООП Python3: выберите все объекты определенного класса без переменных

#python #django #python-3.x #oop

#python #django #python-3.x #ооп

Вопрос:

У меня простой класс:

 class ChannelMessages:
    def __init__(self, channel, date, message):
        self.channel = channel
        self.date = date
        self.message = message

... somecode here ...

for message in messages:
    ChannelMessages(name, message.to_dict()['date'], message.to_dict()['message']) 


... name, date, message - is a variables ...
  

Теперь я хочу выбрать все ChannelMessages объекты класса и поместить их в переменную. Мне не нужно его нигде сохранять, мне нужно один раз отобразить эти классы в моем приложении.

Я пытаюсь использовать что-то вроде Django ORM:

 ChannelMessages.objects.all()
  

но я не могу выбрать их таким образом. Итак, есть ли способ выбрать все созданные объекты без переменных? Или я всегда должен указывать переменные для каждого созданного объекта класса?

Комментарии:

1. «но я не могу выбрать их таким образом» Почему? Также я не понимаю, что вы подразумеваете под «способом выбора всех созданных объектов без переменных». Можете ли вы уточнить?

Ответ №1:

Нет встроенного способа ссылаться на все созданные экземпляры определенного класса. API, которые позволяют вам это делать, должны реализовать это поведение. К счастью, вы можете очень просто воспроизвести это поведение с помощью переменной класса:

 class ChannelMessages:
    all_messages = []

    def __init__(self, channel, date, message):
        self.channel = channel
        self.date = date
        self.message = message
        all_messages.append(self)
  

all_messages Список теперь содержит ссылки на все созданные экземпляры объектов своего класса, к которым, как и ко всем переменным класса, вы можете получить доступ либо через сам класс ( ChannelMessage.all_messages ), либо через любой конкретный экземпляр класса ( self.all_messages ).

Более элегантным решением было бы использовать метаклассы и реализовать __iter__ для самого класса, чтобы вы могли писать for message in ChannelMessages , но с практической точки зрения это работает так же хорошо.

Ответ №2:

Почему бы не сохранить элементы в списке?

 allMessages = []
for message in messages:
    allMessages.append(ChannelMessages(name, message.to_dict()['date'], message.to_dict()['message'])
  

Это также можно сделать в одной строке, используя представление списка:

 allMessages = [ChannelMessages(name, message.to_dict()['date'], message.to_dict()['message']) for message in messages]