簡體   English   中英

Python3 OOP:選擇不帶變量的特定類的所有對象

[英]Python3 OOP: Select all objects of a particular class w/o variables

我有簡單的課程:

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? 還是我總是堅持為每個創建的類對象指定變量?

沒有內置的方式可以引用特定類的所有已創建實例。 使您能夠執行此操作的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編寫for message in ChannelMessages ,但是從實際的角度來看,這也很好。

為什么不將項目存儲在列表中?

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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM