何かを書き留める何か

数学や読んだ本について書く何かです。最近は社会人として生き残りの術を学ぶ日々です。

『Effective Python』Item 25: 親クラスの初期化にはsuperを使おう

『Effective Python』の続き。親の顔を見てみたい。 www.effectivepython.com

子クラスのインスタンスから親クラスの初期化をしたい場合はsuper使え、というタイトルオンリーな話。 クラス階層のメソッドの検索順序はMethod Resolution Order(MRO)として定義されていて、インスタンスmro()メソッドで取得できる。

superを使わない場合の問題として、多重継承を取り上げていて、

  1. 継承した順序と実際の振る舞いに整合性が必ずしもない
  2. ダイアモンド継承でややこしいことになる

という点を上げている。 もっとも、筆者は to avoid in general と述べている、つまり多重継承は基本的に避けろといっているのである…。

Python文法詳解』にも「6.4.3.2 super()」でsuperの利点が簡潔に述べられている。

super()は、インスタンスを初期化する特殊メソッド__init__()などで良く使われています。 一般に、インスタンスの初期化処理は、継承ツリーの祖先から、すべてのクラスで実行する必要がありますが、 super()を使うと、この要件を簡単に実現できます。

とある。

Python 2のsuper()は構文が面倒くさく、クラス自身の名前を含む必要があった(そうである)。 *1

class C(B):
    def method(self, arg):
        super(C, self).method(arg)

一方、Python 3では面倒くささが解消されている。

class C(B):
    def method(self, arg):
        super().method(arg)

クラス名を明示する際も、

class C(B):
    def method(self, arg):
        super(__class__, self).method(arg)

のように出来る。

そういうわけで、Python 3に移行しましょう!

突然話は変わるが、最近Pythonを本格的に使って仕事をしてみたいと思い始めている。 散々Effective Pythonの記事を書いてきたが、仕事ではPythonは全く使ってなく便利ツール程度でしかない。 世の中のPython企業は基本的に経験者のみの採用でWeb系や機械学習系でちょっと即戦力としては難しい。 だが、どこかのPythonを本格的に使う企業で、このポテンシャルを買ってくれるところは無いだろうか。 まだ社会人としての経験は浅いが、第二新卒として、無いだろうか。

*1:私のPython経験はSage Mathから始まったが、すぐPython 3を学び始めたのであまりPython 2のことを知らないのである。