2013-07-16 4 views
0

У меня есть список воспроизведения песен, и я хотел бы создать экземпляр класса SongData для каждой песни в плейлисте. У меня есть код, который не включен, который извлекает название песни, исполнителя и каталог песни из списка воспроизведения. Для целей этого вопроса я включил их как 3 списка, имена песен, имена ArtistNames, dirNames.Как распечатать __str__ для каждого экземпляра класса в цикле

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 

Но до сих пор мне удалось только позвонить одну категорию данных сразу, так он печатает Название: song1, но оставляет поля Artist: и Directory: незаполненными. Я использую:

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

Как я могу распечатать их сразу? Я думаю, проблема в том, что я только ссылаюсь на данные в каждом словаре, не называя экземпляр класса, относящегося к этой песне.

Когда я делаю это просто и вручную, как показано ниже, она работает, но я не могу понять, как поместить это в петлю, так что будет работать для списков songNames, artistNames, dirNames.

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

ответ

4

Ваш SongData класс должен return от __str__ функции:

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 
+0

Спасибо! Является ли 'SongData (* params)' распаковкой 'params' для использования в качестве аргументов в' SongData'? –

+0

@NickCamps это называется, «распаковка», но вы получили идею –

0

Или также можно напечатать for петлю в пределах __str__, а затем возвращает пустую строку.

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

Это работает как очарование для меня. Хотя это может быть не самая лучшая практика.

Смежные вопросы