在我的Web应用程序中,我经常需要将对象序列化为JSON。
默认情况下,并非所有对象都是JSON可序列化的,因此我使用自己的encode_complex
方法,该方法传递给simplejson.dumps
,如下所示:simplejson.dumps(context, default=self.encode_complex)
可以定义我自己的名为__json__(self)
的魔术方法,然后在encode_complex
方法中使用类似以下的代码吗?
def encode_complex(self, obj):
# additional code
# encode using __json__ method
try:
return obj.__json__()
except AttributeError:
pass
# additional code
答案 0 :(得分:11)
__double_underscore__
名称保留用于Python语言的未来扩展,不应该用于您自己的代码(当然,已经定义的代码除外)。为什么不简单地调用方法json()
?
以下是Python language reference的相关部分:
__*__
系统定义的名称。这些名称由解释器及其实现(包括标准库)定义。当前系统名称在特殊方法名称部分和其他地方讨论。更多可能会在未来的Python版本中定义。在任何情况下,如果没有明确记录使用,__*__
名称的任何使用都会在没有警告的情况下破损。
答案 1 :(得分:2)
由于名称重整http://docs.python.org/reference/expressions.html#atom-identifiers,您可能不希望使用双下划线 - 但在概念上,您正在做的事情对您自己的代码来说很好。
答案 2 :(得分:0)
如其他答案中所述,不应使用双下划线。
如果你想使用一个名称暗示只能由内部实现使用的方法,那么我建议使用一个前导下划线。
如PEP 8中所述:
- _single_leading_underscore:弱“内部使用”指标。例如。 “from M import *”不会导入名称以下划线开头的对象。