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 给定对象的可序列化版本或将其传递给它的超类。
我正在制作一个用于将 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 给定对象的可序列化版本或将其传递给它的超类。