Python 打印对象地址而不是值
Python prints object address instead of values
我想打印已添加到 tracks[]
列表中的所有曲目。当我尝试这样做时,我得到了该对象在内存中的地址,而不是它的实际值。我显然不明白从一个 class 到另一个 class 的对象 creation/passing 是如何工作的。
class Song:
def __init__(self, title, artist, album, track_number):
self.title = title
self.artist = artist
self.album = album
self.track_number = track_number
artist.add_song(self)
class Album:
def __init__(self, title, artist, year):
self.title = title
self.artist = artist
self.year = year
self.tracks = []
artist.add_album(self)
def add_track(self, title, artist=None):
if artist is None:
artist = self.artist
track_number = len(self.tracks)
song = Song(title, artist, self, track_number)
self.tracks.append(song)
print(self.tracks)
class Artist:
def __init__(self, name):
self.name = name
self.albums = []
self.songs = []
def add_album(self, album):
self.albums.append(album)
def add_song(self, song):
self.songs.append(song)
class Playlist:
def __init__(self, name):
self.name = name
self.songs = []
def add_song(self, song):
self.songs.append(song)
band = Artist("Bob's Awesome Band")
album = Album("Bob's First Single", band, 2013)
album.add_track("A Ballad about Cheese")
album.add_track("A Ballad about Cheese (dance remix)")
album.add_track("A Third Song to Use Up the Rest of the Space")
playlist = Playlist("My Favourite Songs")
for song in album.tracks:
playlist.add_song(song)
您似乎在尝试打印数组,而不是数组中的值。 print(self.tracks) 正在打印 self.tracks object,这是一个数组。尝试 print(self.tracks[x]),x 是您要打印的字符串的索引。
如果要打印该数组中的所有 object,请遍历它并打印每个 object。
使用它遍历数组:
for x in range(len(self.tracks)):
print self.tracks[x].title
或
for track in self.tracks
print track.title
要获取每首歌曲标题的值 object,请在循环中使用 track.title 对其进行寻址。要获取艺术家或年份,请将其更改为 track.artist 或 track.year。
您可以使用相同的逻辑构建更大的字符串,例如:
print("Title " + track.title + ", 艺术家 " + track.artist)
是的,一个对象的 "value" 包括它的类型和内存位置。您需要提取所需的属性值。请注意,您需要对 Song
属性中包含的其他对象执行此操作。
一种方法是在 class、__repr__
中实施 "representation" 方法。对于您的应用程序,它可能看起来像这样:
def __repr__(self):
return "\n".join([self.title, self.artist.name, self.album.title,
"Track " + str(self.track_number)])
现在,只要您使用语法上需要其字符串表示的 Song
对象,Python 就会使用此方法进行转换。无需任何其他编码,您的程序现在生成:
[A Ballad about Cheese
Bob's Awesome Band
Bob's First Single
Track 0]
[A Ballad about Cheese
Bob's Awesome Band
Bob's First Single
Track 0, A Ballad about Cheese (dance remix)
Bob's Awesome Band
Bob's First Single
Track 1]
[A Ballad about Cheese
Bob's Awesome Band
Bob's First Single
Track 0, A Ballad about Cheese (dance remix)
Bob's Awesome Band
Bob's First Single
Track 1, A Third Song to Use Up the Rest of the Space
Bob's Awesome Band
Bob's First Single
Track 2]
当然,您需要根据自己的列表需求对其进行自定义。
我想打印已添加到 tracks[]
列表中的所有曲目。当我尝试这样做时,我得到了该对象在内存中的地址,而不是它的实际值。我显然不明白从一个 class 到另一个 class 的对象 creation/passing 是如何工作的。
class Song:
def __init__(self, title, artist, album, track_number):
self.title = title
self.artist = artist
self.album = album
self.track_number = track_number
artist.add_song(self)
class Album:
def __init__(self, title, artist, year):
self.title = title
self.artist = artist
self.year = year
self.tracks = []
artist.add_album(self)
def add_track(self, title, artist=None):
if artist is None:
artist = self.artist
track_number = len(self.tracks)
song = Song(title, artist, self, track_number)
self.tracks.append(song)
print(self.tracks)
class Artist:
def __init__(self, name):
self.name = name
self.albums = []
self.songs = []
def add_album(self, album):
self.albums.append(album)
def add_song(self, song):
self.songs.append(song)
class Playlist:
def __init__(self, name):
self.name = name
self.songs = []
def add_song(self, song):
self.songs.append(song)
band = Artist("Bob's Awesome Band")
album = Album("Bob's First Single", band, 2013)
album.add_track("A Ballad about Cheese")
album.add_track("A Ballad about Cheese (dance remix)")
album.add_track("A Third Song to Use Up the Rest of the Space")
playlist = Playlist("My Favourite Songs")
for song in album.tracks:
playlist.add_song(song)
您似乎在尝试打印数组,而不是数组中的值。 print(self.tracks) 正在打印 self.tracks object,这是一个数组。尝试 print(self.tracks[x]),x 是您要打印的字符串的索引。
如果要打印该数组中的所有 object,请遍历它并打印每个 object。
使用它遍历数组:
for x in range(len(self.tracks)):
print self.tracks[x].title
或
for track in self.tracks
print track.title
要获取每首歌曲标题的值 object,请在循环中使用 track.title 对其进行寻址。要获取艺术家或年份,请将其更改为 track.artist 或 track.year。
您可以使用相同的逻辑构建更大的字符串,例如: print("Title " + track.title + ", 艺术家 " + track.artist)
是的,一个对象的 "value" 包括它的类型和内存位置。您需要提取所需的属性值。请注意,您需要对 Song
属性中包含的其他对象执行此操作。
一种方法是在 class、__repr__
中实施 "representation" 方法。对于您的应用程序,它可能看起来像这样:
def __repr__(self):
return "\n".join([self.title, self.artist.name, self.album.title,
"Track " + str(self.track_number)])
现在,只要您使用语法上需要其字符串表示的 Song
对象,Python 就会使用此方法进行转换。无需任何其他编码,您的程序现在生成:
[A Ballad about Cheese
Bob's Awesome Band
Bob's First Single
Track 0]
[A Ballad about Cheese
Bob's Awesome Band
Bob's First Single
Track 0, A Ballad about Cheese (dance remix)
Bob's Awesome Band
Bob's First Single
Track 1]
[A Ballad about Cheese
Bob's Awesome Band
Bob's First Single
Track 0, A Ballad about Cheese (dance remix)
Bob's Awesome Band
Bob's First Single
Track 1, A Third Song to Use Up the Rest of the Space
Bob's Awesome Band
Bob's First Single
Track 2]
当然,您需要根据自己的列表需求对其进行自定义。