methaneのブログ

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

super() について

コメントやトラックバックで指摘されたとおり、下記の考察は完全に誤りです。後日 Python3 の super について記事を書きます

http://d.hatena.ne.jp/w_o/20081205#p2

うーん…↓このぐらいに書けないものかな…

class Base:
    def __init__(self):
        super().__init__()
        print ('Base')

class A(Base):
    def __init__(self):
        super().__init__()
        print ('A')

class B(Base):
    def __init__(self):
        super().__init__()
        print ('B')

class C(B,A):
    def __init__(self):
        super().__init__()
        print ('C')

b = C()

super は self の mro から ひとつ手前の class を取り出す関数だから、 self と Type を知らないといけない。この二つを引数にとるのが自然。普通の関数の仕組みのままでできる。

self と Type を省略できるようにしようとすると、通常の def とは違う、class 構文内でしか使えないメソッド定義専用の構文が必要になるし、superだけじゃなくてselfも用意しないといけない。class周りの構文がもう一セットできる訳だ。

self や super の引数が省略できるメリットと、同じ事をする構文が二セットある*1デメリットを天秤にかけたとき、新たな構文の採用をしないのが Python のやり方。

そもそも、普通に考えたら必要な self と Type を、暗黙に解決して省略しようという発想自体が Pythonic じゃない。暗黙にいろいろやってくれるのが好きなら Perl を使えと。

*1:これぞまさしく「やり方がひとつだけあるのがいいね」に反する