str (または int) から継承するクラスを作成するときに問題が発生する理由
class C(str):
def __init__(self, a, b):
str.__init__(self,a)
self.b = b
C("a", "B")
TypeError: str() takes at most 1 argument (2 given)
int
の代わりにを使用しようとすると、同じことが起こりますstr
が、カスタム クラスでは機能します。__new__
の代わりにを使用する必要があります__init__
。なぜでしょうか。
ベストアンサー1
>>> class C(str):
... def __new__(cls, *args, **kw):
... return str.__new__(cls, *args, **kw)
...
>>> c = C("hello world")
>>> type(c)
<class '__main__.C'>
>>> c.__class__.__mro__
(<class '__main__.C'>, <type 'str'>, <type 'basestring'>, <type 'object'>)
はオブジェクトが構築された後に呼び出されるため__init__
、不変型の値を変更するには遅すぎます。 は__new__
クラスメソッドなので、最初のパラメータを呼び出しました。cls
見るここ詳細については
>>> class C(str):
... def __new__(cls, value, meta):
... obj = str.__new__(cls, value)
... obj.meta = meta
... return obj
...
>>> c = C("hello world", "meta")
>>> c
'hello world'
>>> c.meta
'meta'