Python 中的 default() 方法

default() method in Python

我正在制作一个用于将 python 对象转换为 json 的编码器,并且在研究时我看到了很多包含 default 方法的解决方案。我不是 Python 方面的专家,但也绝对不是新手,我想知道我是否以某种方式错过了 default 方法,它在 运行 时自动获取 class 被调用。或者,这仅仅是因为我继承了 JSONEcoder class(它有一个默认方法,我现在只是覆盖)?有人可以澄清吗?如果是这样,它与

基本相同吗?
__init__()

方法?

顺便说一句,如果您需要更多视觉效果,我的编码器看起来像这样:

class ComplexEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, my_custom_object):
            return str(obj)
        return json.JSONEncoder.default(self, obj)

JSONEncoder 有一个 default 方法,如果它不知道如何将特定对象强制转换为有效 JSON,则会调用该方法。默认实现只是引发 TypeError (因为它不知道如何强制类型)。但是,当 覆盖默认方法时,你有机会 return 编码器 确实 知道如何处理的对象。如果不知道如何处理输入的类型(例如它不是my_custom_type的实例),那么你应该raise TypeError自己,或调用 JSONencoder 上的 default 方法,以便引发错误。

经常,您会看到 super 在这里用于合作继承:

class ComplexEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, my_custom_object):
            return str(obj)
        return super(ComplexEncoder, self).default(obj)

如果所有你构建的编码器类都是这种形式,你可以将它们混合在一起:

class MySuperEncoder(ComplexEncoder, WidgetEncoder, FooEncoder):
    pass

现在 ComplexEncoder 将处理它知道的事情(例如 my_custom_object),WidgetEncoder 将编码它知道如何处理的事情(可能 Widget 个实例), 等等。

运行 dir(JSONEncoder) 给我们:

['__class__',
 '__delattr__',
 '__dict__',
 '__doc__',
 '__format__',
 '__getattribute__',
 '__hash__',
 '__init__',
 '__module__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__',
 'default',  # We found our method, let's see what it does
 'encode',
 'item_separator',
 'iterencode',
 'key_separator']

运行 help(JSONEncoder.default) 给我们:

default(self, o) unbound json.encoder.JSONEncoder method
    Implement this method in a subclass such that it returns
    a serializable object for ``o``, or calls the base implementation
    (to raise a ``TypeError``).

    For example, to support arbitrary iterators, you could
    implement default like this::

        def default(self, o):
            try:
                iterable = iter(o)
            except TypeError:
                pass
            else:
                return list(iterable)
            # Let the base class default method raise the TypeError
            return JSONEncoder.default(self, o)

所以它似乎是这样设计的,如果您将这个对象子类化,您可以编写自己的代码。

我认为此方法已在 json.JSONEncoder 中定义,如 here 所述。 default(o) 应该 return 给定对象的可序列化版本或将其传递给它的超类。