Python3 OOP:选择不带变量的特定类的所有对象

时间:2019-04-01 11:08:44

标签: python django python-3.x oop

我上了简单的课:

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

但是我不能以这种方式选择它们。因此,有没有一种方法可以选择所有创建的对象而无需var?还是我总是为每个创建的类对象指定变量?

2 个答案:

答案 0 :(得分:3)

没有内置的方式可以引用特定类的所有已创建实例。使您能够执行此操作的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 :(得分:1)

为什么不将项目存储在列表中?

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]