可以自己写魔法吗?
在我的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
的__double_underscore__
名是保留给Python语言的未来扩展,不应该被用于自己的代码(除已定义当然的)。为什么不简单地调用方法json()
?
下面是从Python language reference的相关章节:
__*__
系统定义的名称。这些名称由解释器及其实现(包括标准库)定义。当前系统名称在特殊方法名称部分和其他地方讨论。未来版本的Python中可能会定义更多。在任何情况下,任何使用__*__
的名称,如果没有明确记录使用,都会在没有警告的情况下发生破裂。
您可能不希望使用双下划线,因为名称损坏http://docs.python.org/reference/expressions.html#atom-identifiers - 然而在概念上,您所做的对自己的代码而言是很好的。
感谢您的回应,但专用名称修改仅适用于不以两个或多个下划线结尾的方法 – 2012-02-15 23:07:29
有趣,谢谢。 – 2012-02-15 23:08:37
正如其他答案中所解释的,不应使用双下划线。
如果您想要使用一个名称暗示仅供内部实现使用的方法,那么我建议使用一个前导下划线。
如PEP 8解释:
- _single_leading_underscore:弱 “内部使用” 指示器。例如。 “从M导入*”不导入名称以下划线开头的对象。
+1在这里,因为你的问题使我知道名称修改不会发生在也以*两个下划线*结尾的方法上。并不是说我会用它来创建新的魔法方法。 – 2012-07-06 17:33:27