Python中如何将随机songID传入函数与类以展示随机歌曲信息
解决类实现随机歌曲展示的问题
核心问题分析
你遇到的songId始终为0的问题,本质是随机生成的ID没有传递到类的实例中,同时readSongsJSON函数没有根据随机ID获取对应歌曲数据。下面是具体的修复步骤和代码示例:
步骤1:让readSongsJSON接收随机ID参数
修改函数,使其根据传入的songId从JSON文件中返回对应歌曲的详情(这里假设你的JSON结构是[{"id": 1, "title": "xxx", ...}, ...],如果是其他结构可自行调整):
import json def readSongsJSON(song_id): with open("songs.json", "r", encoding="utf-8") as f: songs = json.load(f) # 遍历找到对应ID的歌曲 for song in songs: if song["id"] == song_id: return song # 未找到时返回None return None
步骤2:重构songDetails类
让类在初始化时接收歌曲数据,直接从数据中提取songId和其他属性,而不是用默认值0:
class songDetails: def __init__(self, song_data): # 从传入的歌曲数据中赋值属性 self.songId = song_data.get("id", 0) self.title = song_data.get("title", "未知歌曲") self.artist = song_data.get("artist", "未知歌手") # 可根据你的JSON结构添加更多属性 def display_song(self): # 展示歌曲详情的方法 print(f"随机推荐歌曲:") print(f"ID: {self.songId}") print(f"标题:{self.title}") print(f"歌手:{self.artist}")
步骤3:修改randomSong函数传递随机ID
先获取所有有效的歌曲ID(避免生成不存在的ID),生成随机ID后传给readSongsJSON,再将返回的歌曲数据传入songDetails实例:
import random import typer def randomSong(): # 先读取所有歌曲,获取有效ID列表 with open("songs.json", "r", encoding="utf-8") as f: songs = json.load(f) valid_song_ids = [song["id"] for song in songs] # 随机选择一个ID random_song_id = random.choice(valid_song_ids) # 根据ID获取歌曲数据 song_data = readSongsJSON(random_song_id) if not song_data: print(f"未找到ID为{random_song_id}的歌曲") return # 实例化类并展示结果 song = songDetails(song_data) song.display_song() # 触发Typer命令 if __name__ == "__main__": typer.run(randomSong)
关键注意点
- 如果你的JSON文件是以
songId为键的字典(比如{"1": {"title": "xxx"}, ...}),readSongsJSON可以简化为直接返回songs.get(str(song_id))(注意ID的类型匹配)。 - 始终确保随机生成的ID在JSON的有效ID范围内,避免出现找不到歌曲的情况。
内容的提问来源于stack exchange,提问作者Steven Diffey
相关产品推荐
相关产品推荐

