Python3 ООП: выбрать все объекты определенного класса без переменных - PullRequest
2 голосов
/ 01 апреля 2019

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

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()

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

Ответы [ 2 ]

3 голосов
/ 01 апреля 2019

Нет встроенного способа ссылаться на все созданные экземпляры определенного класса.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, но с практической точки зрения это работает так же хорошо.

1 голос
/ 01 апреля 2019

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

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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...