写自己的魔术方法可以吗?

时间:2012-02-15 22:58:01

标签: python

在我的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

3 个答案:

答案 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 *”不会导入名称以下划线开头的对象。
  •