2011-07-14 4 views
0

なぜこれは機能しませんか?私はせずにオブジェクトを初期化のinit方法はユニコードクラスのinit方法(あなたのMROに感謝)をデフォルトとなり、私は私ののinit方法は、しかし、と呼ばれているものであることを知っていることを知っている大文字の文字列としてその値を保持するPythonクラスを作成すると動作しません

>>> class A (unicode): 
...  def __init__ (self, value): 
...   super(unicode, self).__init__(str(value).upper()) 
... 
>>> assert A('hello') == u'HELLO' 

Traceback (most recent call last): 
    File "<pyshell#39>", line 1, in <module> 
    assert A('hello') == u'HELLO' 
AssertionError 
>>> 

それは働きたいと思わない。余分な行を追加して、明示的にvalueパラメーターの値をupperに設定しても、それでも機能しないようにします。

私は望ましい効果を得るためにのreprSTR特別なクラスを定義する(そしておそらくする必要があります)ことができますが、私はこれが動作しない理由として、少し興味があります。

ありがとうございます。

答えて

4

unicodeimmutable object使用__new__の代わり__init__です:

class A (unicode): 
    def __new__ (cls, value): 
     return unicode.__new__(cls, str(value).upper()) 

print A('hello') 
u'HELLO' 
2

super(unicode, self)の代わりに、super(A, self) - 前者はobject.__init__です。

さらに、ユニコードオブジェクトは不変なので、__init__は何もしません。代わりに(もinterningを妨げる)__init__との定期的な初期化、上書きするコンストラクタは__new__です:

class A (unicode): 
    def __new__(cls, value): 
     return super(A, cls).__new__(cls, str(value).upper()) 
+0

+1、ありますそれについては「おそらく」ない。 「スーパー」は確かに混乱することがあります。 – SingleNegationElimination

+0

@phihag、私は最初の部分を理解することができます、実際に私は通常super(self .__ class__、self)を使用します。私は2番目の部分を理解していると思う...ユニコードオブジェクトは不変であるため、インスタンスが作成されているとき(つまり__new__)は、作成され初期化されてから実際に設定されます。ありがとう。 – Evrim