Ame*_*ade 5 python default encoder
我正在制作一个用于将 python 对象转换为 json 的编码器,在研究时我看到了很多包含default方法的解决方案。我不是 Python 专家,但也绝对不是新手,我想知道我是否以某种方式错过了在default调用类时自动运行的方法。或者,这仅仅是因为我继承了JSONEcoder类(它有一个默认方法,我现在只是覆盖)?有人可以澄清吗?如果是这样,它是否与
__init__()
Run Code Online (Sandbox Code Playgroud)
方法?
顺便说一句,如果您需要更多视觉效果,我的编码器看起来像这样:
class ComplexEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, my_custom_object):
return str(obj)
return json.JSONEncoder.default(self, obj)
Run Code Online (Sandbox Code Playgroud)
JSONEncoder有一个default方法,如果它不知道如何将特定对象强制转换为有效的 JSON,则会调用该方法。默认实现只是引发TypeError(因为它不知道如何强制类型)。但是,当你覆盖默认的方法,你有机会返回一个对象,编码器不知道如何处理。如果您不知道如何处理输入的类型(例如它不是 的实例my_custom_type),那么您应该raise TypeError自己或者调用该default方法,JSONencoder以便它可以引发错误。
通常,您会super在此处看到用于协作继承:
class ComplexEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, my_custom_object):
return str(obj)
return super(ComplexEncoder, self).default(obj)
Run Code Online (Sandbox Code Playgroud)
如果您构建的所有编码器类都是这种形式,您可以将它们混合在一起:
class MySuperEncoder(ComplexEncoder, WidgetEncoder, FooEncoder):
pass
Run Code Online (Sandbox Code Playgroud)
现在ComplexEncoder将处理它知道的事情(例如my_custom_object),WidgetEncoder将编码它知道如何处理的事情(可能是Widget实例),等等。