immutableな型のカスタマイズについて
(5/16追記。このエントリの結論は違っていました。コメント欄をご覧ください。)
昨日の記事でunicodeクラスを親として作成したクラスが思い通りに動かなくて嵌っていると書いたのですが、これは
「unicode型がイミュータブルだから」
ということのようです。
immutable(イミュータブル)は変更不可能という意味ですが、生成されたインスタンスが変更不可能というだけではなくその派生クラスにおいて初期化をカスタマイズすること、つまり__init__メソッドをオーバーライドすることはできないということのようです。
- python - Extend str class to take additional parameters - Stack Overflow
- class design - Python: extending int and MRO for __init__ - Stack Overflow
immutableな型には他にint,str,tupleなどがあります。
これらの型は上で書いたように初期化をカスタマイズすることはできないのですが、インスタンス生成をカスタマイズすることはでき、__new__メソッドを使うと良いようです。
昨日の記事で書いていた
class Test(unicode): def __init__(self, x): print x
は
class Test(unicode): def __new__(cls, x): print x
と書くと期待通りの動作となります。
class Test(unicode): def __new__(cls, x): print x a = Test("あいうえお") #あいうえお b = Test(x="あいうえお") # キーワード引数も受け取れる! #あいうえお
通常の__new__の使い方はクラスのインスタンスを戻り値とする使い方です。
http://www.python.jp/doc/nightly/reference/datamodel.html#customization