メモ:コンストラクタの連鎖(失敗)
新スタイルクラス(バージョン2.2から登場したnew-style class)形式でのクラス宣言。
objectをルートとしてを継承する。
class BaseClass(object): def __init__(self): print self
新スタイルクラスでいろいろ機能が追加された(__slots__とか)ので
とりあえずはobjectを継承しておくべきと思われる。
で、本題の新スタイルクラスの継承によるコンストラクタの連鎖なのだが
下のような書き方はとてもデンジャラスだった。
class InheritClass(BaseClass): def __init__(self, *args): super(self.__class__, self).__init__(*args)
3つ目の継承を同じ書き方すると大変よろしくない。
class ThirdClass(InheritClass): def __init__(self, *args): super(self.__class__, self).__init__(*args)
selfの型は持ち越しなので
ThirdClass.__init__(self(ThirdClassのオブジェクト))
↓
InheritClass.__init__(self(ThirdClassのオブジェクト))
↓
無限ループw
おとなしく
class InheitClass(BaseClass): def __init__(self, *args): BaseClass.__init__(self, *args)
もしくは
class InheritClass(BaseClass): def __init__(self, *args): super(InheritClass, self).__init__(*args)
とやるしかないっぽい。
同じクラス名を2度書かないといけないのが気に入らないのだが今のところ解決方法は知らない。
super()には慎重にならざるを得ないなぁ。