我有一个歌曲播放列表,我想为播放列表中的每首歌曲创建一个SongData类的实例。我有未包含的代码,可以从播放列表中提取歌曲名称、艺术家和歌曲目录。出于这个问题的目的,我已经将这些列为3个列表,歌曲名称,艺人名称,目录名称。
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']
我怎样才能一次把它们全部打印出来?我认为问题是我只引用了每个字典中的数据,而没有调用与那首歌相关的类的实例。
当我按如下所示简单手动地执行时,它是有效的,但我不知道如何将其放入循环中,因此它将适用于列表songNames
、artistNames
和dirNames
。
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)]
请注意,以上是一个列表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 ""
这对我来说是一种魅力。尽管可能不是最好的做法。