【发布时间】:2020-10-25 22:23:52
【问题描述】:
我有以下代码,其中一个类具有 3 个属性和两个函数。
import json
class Song:
def __init__(self, name, artist, full_title=None):
self.name = name
self.artist = artist
self.full_title = self.name + ' ' + self.artist
def save_json(list_of_objects, json_file):
# json save
with open(json_file, 'w') as fp:
json.dump(list_of_objects, fp, indent=4)
def load_json(json_file):
# json load
with open(json_file, 'r') as fp:
loaded_data = json.load(fp)
return loaded_data
file = 'my_songs.json'
song1 = Song('Roar', 'Katy Perry')
song2 = Song('Hello', 'Adele')
song3 = Song('Grenade', 'Bruno Mars')
list_of_songs = [song1, song2, song3]
list_of_songs_dict = [vars(s) for s in list_of_songs]
save_json(list_of_songs_dict, file)
如您所见,该对象使用三个参数(名称、艺术家、完整标题)进行初始化
代码创建一个对象列表并将其转储到名为“my_songs.json”的 json 文件中。
json文件长这样
[
{
"name": "Roar",
"artist": "Katy Perry",
"full_title": "Roar Katy Perry"
},
{
"name": "Hello",
"artist": "Adele",
"full_title": "Hello Adele"
},
{
"name": "Grenade",
"artist": "Bruno Mars",
"full_title": "Grenade Bruno Mars"
}
]
我想从 json 文件(名为“my_songs.json”)重新创建名为“list_of_songs”的列表。
这就是我的做法:
loaded_songs = load_json(file)
list_of_songs_from_json = [Song(**o) for o in loaded_songs]
print(list_of_songs_from_json)
IDE 显示一条警告,提示“未使用参数 full_title 值”
如果我从类初始化中删除 'full_title=None',我会收到以下错误消息:
TypeError: __init__() got an unexpected keyword argument 'full_title'
'full_title=None' 在类初始化中的原因是,在某些情况下,我想使用 2 个参数来定义对象,而在其他情况下(比如从 json 文件加载数据时)我想使用 3 个参数定义对象。
我怀疑有一种“正确”或“更好”的方法可以做到这一点,因此发出警告。有关如何删除警告并实现代码已经完成的任何建议?
谢谢。
【问题讨论】:
标签: python json oop initialization typeerror