#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]