0

曲のプレイリストがあり、プレイリスト内の曲ごとに 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

しかし、これまでのところ、一度に 1 つのデータ カテゴリしか呼び出せなかったため、Title: song1 が出力されますが、セクションArtist:Directory:セクションは空白のままです。私は使用しています:

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

それらを一度に印刷するにはどうすればよいですか?問題は、各辞書のデータを参照しているだけで、その曲に関連するクラスのインスタンスを呼び出していないことだと思います。

次のように単純かつ手動で行うと機能しますが、これをループに入れる方法がわからないため、リスト、、、で機能songNamesartistNamesますdirNames

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

2 に答える 2

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)]

上記は、上記の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 
于 2013-07-16T14:52:34.573 に答える