如何在循环中为类的每个实例打印__str__

时间:2013-07-16 14:47:22

标签: python python-2.7

我有一个歌曲播放列表,我想为播放列表中的每首歌创建一个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

但到目前为止,我只设法同时调用一个数据类别,因此它打印标题:song1但将Artist:Directory:部分留空。我一直在使用:

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

如何让它一次打印出来?我认为问题是我只引用每个字典中的数据,而不是调用与该歌曲相关的类的实例。

当我简单地手动执行此操作时,如下所示,它可以正常工作,但我无法弄清楚如何将其放入循环中,因此它适用于列表songNamesartistNames,{{ 1}}。

dirNames

2 个答案:

答案 0 :(得分: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 

答案 1 :(得分:0)

或者也可以在for函数中打印__str__循环,然后返回空字符串。

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

这对我来说就像一个魅力。虽然可能不是最好的做法。