2016-12-01 16 views
0

をSTRのサブクラスの変数を渡すとき、予期しない結果を与える私はこのようなSTRのサブクラスを書いた: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__

建設中の初期化は、pythonで大まかなルックスですん

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) 

今では動作します!私はstrが持っていたという不変性を回復するために__slots__ =()を追加しました

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

注意。

+0

非常にクリア、ありがとう! – Hale