str または int からの継承 質問する

str または int からの継承 質問する

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'

おすすめ記事