Python 中的 default() 方法

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)

mgi*_*son 6

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实例),等等。