2012-02-15 51 views
4

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

回答

9

__double_underscore__名是保留給Python語言的未來擴展,不應該被用於自己的代碼(除已定義當然的)。爲什麼不簡單地調用方法json()

下面是從Python language reference的相關章節:

__*__
系統定義的名稱。這些名稱由解釋器及其實現(包括標準庫)定義。當前系統名稱在特殊方法名稱部分和其他地方討論。未來版本的Python中可能會定義更多。在任何情況下,任何使用__*__的名稱,如果沒有明確記錄使用,都會在沒有警告的情況下發生破裂。

2

您可能不希望使用雙下劃線,因爲名稱損壞http://docs.python.org/reference/expressions.html#atom-identifiers - 然而在概念上,您所做的對自己的代碼而言是很好的。

+2

感謝您的迴應,但專用名稱修改僅適用於不以兩個或多個下劃線結尾的方法 – 2012-02-15 23:07:29

+0

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

0

正如其他答案中所解釋的,不應使用雙下劃線。

如果您想要使用一個名稱暗示僅供內部實現使用的方法,那麼我建議使用一個前導下劃線。

PEP 8解釋:

  • _single_leading_underscore:弱 「內部使用」 指示器。例如。 「從M導入*」不導入名稱以下劃線開頭的對象。
相關問題