簡體   English   中英

如何在循環中為每個類實例輸出__str__

[英]How to print out __str__ for each instance of a class in a loop

我有一個歌曲的播放列表,我想為該播放列表中的每首歌曲創建一個類SongData的實例。 我有未包含的代碼,用於從播放列表中提取歌曲名稱,藝術家和歌曲目錄。 出於這個問題的目的,我將這些作為3個列表包括在內,即songNames,artistNames和dirNames。

class SongData(object):
    def __init__(self, title="", artist="", directory=""):
        self.title, self.artist, self.directory = title, artist, directory
    def __str__(self):
        desc_str = "Title: %s \nArtist: %s \nDirectory: %s \n" %(self.title,
                                            self.artist, self.directory)
        print desc_str

songNames = ['song1', 'song2', 'song3']
artistNames = ['artist1', 'artist2', 'artist3']
dirNames = ['dir1', 'dir2', 'dir3']

songs = {name: SongData(title=name) for name in songNames}
artists = {band: SongData(artist=band) for band in artistNames}
directorys = {direc: SongData(directory=direc) for direc in dirNames}

我希望能夠為每首歌曲打印出desc_str,因此它看起來像這樣:

Title: song1 
Artist: artist1 
Directory: dir1

但是到目前為止,我只設法一次調用了一個數據類別,因此它打印了Title:song1,但將Artist:Directory:部分留為空白。 我一直在使用:

print songs['song1']
print artists['artist1']

我怎樣才能一次將它們全部打印出來? 我認為問題在於我只引用每個詞典中的數據,而沒有調用與該歌曲相關的類的實例。

當我按如下所述簡單而手動地進行操作時,它可以工作,但是我無法弄清楚如何將其放入循環中,因此它可以用於列表songNamesartistNamesdirNames

p = SongData('song1', 'artist1', 'dir1')
p.__str__()

您的SongData類需要從__str__函數return

class SongData(object):
    def __init__(self, title="", artist="", directory=""):
        self.title, self.artist, self.directory = title, artist, directory
    def __str__(self):
        desc_str = "Title: %s \nArtist: %s \nDirectory: %s \n" %(self.title,
                                            self.artist, self.directory)
        return desc_str # <------ RETURN HERE

然后,您可以像這樣構建SongData實例:

songNames = ['song1', 'song2', 'song3']
artistNames = ['artist1', 'artist2', 'artist3']
dirNames = ['dir1', 'dir2', 'dir3']

songdata = [SongData(*params) for params in zip(songNames, artistNames, dirNames)]

請注意,以上是一個list-comp,上面給出的3個列表實際上等效於:

songdata = [
    SongData('song1', 'artist1', 'dir1'),
    SongData('song2', 'artist2', 'dir2'),
    SongData('song3', 'artist3', 'dir3')
]

然后遍歷這些,並使用print獲得__str__的結果:

for song in songdata:
    print song

給你:

Title: song1 
Artist: artist1 
Directory: dir1 

Title: song2 
Artist: artist2 
Directory: dir2 

Title: song3 
Artist: artist3 
Directory: dir3 

或者也可以在__str__函數中打印一個for循環,然后返回空字符串。

def __str__(self):
    for item in self.UserClasses:
        print item
    return ""

這對我來說就像是一種魅力。 雖然可能不是最佳做法。

暫無
暫無

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

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