您现有代码的问题是没有全局函数(或其他任何东西)
student2dict
,因为你把它缩进了
class Student
定义。
只要去掉它,它就会起作用:
class Student(object):
def __init__(self,name,age,score):
self.name = name
self.age = age
self.score = score
def student2dict(std):
return{
'name':std.name,
'age':std.age,
'score':std.score
}
s= Student('Penny',20,88)
std_data = json.dumps(s,default=student2dict)
print('Dump Student:',std_data)
不过,似乎你希望它是一种方法,而不是一个简单的函数:
在我尝试使用default=s.student2dict而不是dedault=student2dict之前
一般方法需要
self
参数。这就是它如何知道你在调用哪个实例。你得到的错误大概是关于打电话
学生信息技术
有两个论点
s
从
s.student2dict
,同样
s公司
又经过了
json.dumps
)当它只想要一个(
std
)中。
你可以解决这个问题:
class Student(object):
def __init__(self,name,age,score):
self.name = name
self.age = age
self.score = score
def student2dict(self, std):
return{
'name':std.name,
'age':std.age,
'score':std.score
}
现在你可以通过了
default=s.student2dict
它会起作用的。
但这真的不是一个很好的设计。如果你没有真正使用
自己
不管怎样,你并不是真的在写一个实例方法。
(你
能够
使之成为
static method
因为他们既不需要也不需要
自己
,但我觉得在这里这样做毫无意义。如果这是你想要的,一个全局函数可能更有意义。)
但是如果你摆脱了
性病
,并使用
自己
相反呢?
class Student(object):
def __init__(self,name,age,score):
self.name = name
self.age = age
self.score = score
def student2dict(self):
return{
'name':self.name,
'age':self.age,
'score':self.score
}
现在,你不想通过
学生信息技术
,因为那是
界限法
,由实例拥有
s公司
. 不能用参数调用它,因为参数已绑定在中。对于两个参数而不是一个参数,您将得到相同的错误。
你想要的是
非绑定方法
,通过在
班
,而不是实例,以便以后可以用任何实例调用它。这样地:
s= Student('Penny',20,88)
std_data = json.dumps(s,default=Student.student2dict)
print('Dump Student:',std_data)
这很有效,因为
Student.student2dict(s)
做同样的事情
s.student2dict()
. 所以,如果你通过了
Student.student2dict
致
json.dumps文件
,当它启动时
S公司
,你得到了你想要的。