All three of the classes in the example are basically worthless. Including SongList, which is the one with the most logic (a single line) and which you didn't even use at the end. Here's the three classes, at their most future-proof:
from collections import namedtuple
Song = namedtuple('Song', 'name duration artist')
Artist = namedtuple('Artist', 'name')
class SongList(list): pass
and as a side-note, this: for song in (song for song in songList if song.duration < 10):
print "%s by %s (%d)" % (song.name, song.artist, song.duration)
is needlessly complex, why the comprehension? Just write a loop and a conditional: for song in songList:
if song.duration < 10:
print "{0.name} by {0.artist.name} ({0.duration})".format(song)