読者です 読者をやめる 読者になる 読者になる

methaneのブログ

このブログに乗せているサンプルコードはすべてNYSLです。

親クラスのコンストラクタ

http://d.hatena.ne.jp/w_o/20081203#p1

Pythonで親クラスの__init__を呼ぶルールって酷いと思うのだけど、これPython信者たちはなんて言って褒めてるのかな…

* super(Type, self)というのが意味不明すぎ
* 自分のクラスを書かないといけない
* 忘れると死亡

コンストラクタの書き方はD言語が一番良いのではないかと思う。

それは本当にPythonなのか??super(Type, self) なんて使ったこと無かったけど、確かにそういう書き方もできた。それでも、一般的ではない。多重継承できる言語で super とか判りにくくて仕方ない。

>>> class Foo(object):
...   def __init__(self):
...     print "Foo.__init__"
...
>>> class Bar(Foo):
...   def __init__(self):
...     print "Bar.__init__"
...     Foo.__init__(self)
...
>>> Bar()
Bar.__init__
Foo.__init__

D言語に一番似てるのがPythonじゃない?

Pythonの __init__ は、そのほかのメソッドと同じく、ただの関数。コンストラクタだからって何も特別なことはしない。構文上、__init__ はほかの関数に比べて何の特別扱いも受けない。

>>> def init(self):
...   print "initializing ", str(type(self))
...
>>> class Foo(object):
...   pass
...
>>> f = Foo()
>>> Foo.__init__ = init
>>> f = Foo()
initializing  <class '__main__.Foo'>
>>> f.__init__()
initializing  <class '__main__.Foo'>
>>> g = f.__init__
>>> g()
initializing  <class '__main__.Foo'>