2016-12-01 33 views
0

時會出現意想不到的結果,我寫了海峽的一個子類是這樣的:json.dumps()通過海峽的子類的變量在Python 2.7

class URL(str): 
    def __init__(self, url): 
     u = normalize_url(url) 
     print u 
     super(URL, self).__init__(string=u) 

normalize_url()功能用於做這樣的事情url編碼。一切都很好,直到我用json.dumps()。這裏是我的測試代碼:

>>> u = URL('https://example.com/path contains space.html') 
https://example.com/path%20contains%20space.html 
>>> json.dumps(u) 
'"https://example.com/path contains space.html"' 

爲什麼json.dumps()沒有給「https://example.com/path%20contains%20space.html

回答

0

str(像其他不可變對象),它的初始化在__new__

對象的建設蟒蛇大致長相像這樣:

inst = cls.__new__(cls, *args, **kwargs) 
cls.__init__(inst, *args, **kwargs) 

在你的例子中,你可以撥打__init__,但爲時已晚,對象已經成立__new__

但是,您可以解決這個問題!:

class URL(str): 
    __slots__ =() 

    def __new__(cls, val): 
     val = val.replace(' ', '%20') 
     super(URL, cls).__new__(cls, val) 

現在,它的作品!

>>> x = URL('foo bar') 
>>> x 
'foo%20bar' 
>>> json.dumps(x) 
'"foo%20bar"' 

請注意,我添加__slots__ =()恢復不變性是str了。

+0

很清楚,謝謝! – Hale

相關問題