可以自己写魔法吗?

问题描述:

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

+1在这里,因为你的问题使我知道名称修改不会发生在也以*两个下划线*结尾的方法上。并不是说我会用它来创建新的魔法方法。 – 2012-07-06 17:33:27

__double_underscore__名是保留给Python语言的未来扩展,不应该被用于自己的代码(除已定义当然的)。为什么不简单地调用方法json()

下面是从Python language reference的相关章节:

__*__
系统定义的名称。这些名称由解释器及其实现(包括标准库)定义。当前系统名称在特殊方法名称部分和其他地方讨论。未来版本的Python中可能会定义更多。在任何情况下,任何使用__*__的名称,如果没有明确记录使用,都会在没有警告的情况下发生破裂。

您可能不希望使用双下划线,因为名称损坏http://docs.python.org/reference/expressions.html#atom-identifiers - 然而在概念上,您所做的对自己的代码而言是很好的。

+2

感谢您的回应,但专用名称修改仅适用于不以两个或多个下划线结尾的方法 – 2012-02-15 23:07:29

+0

有趣,谢谢。 – 2012-02-15 23:08:37

正如其他答案中所解释的,不应使用双下划线。

如果您想要使用一个名称暗示仅供内部实现使用的方法,那么我建议使用一个前导下划线。

PEP 8解释:

  • _single_leading_underscore:弱 “内部使用” 指示器。例如。 “从M导入*”不导入名称以下划线开头的对象。