『Effective Python』の続き。親の顔を見てみたい。 www.effectivepython.com
子クラスのインスタンスから親クラスの初期化をしたい場合はsuper
使え、というタイトルオンリーな話。
クラス階層のメソッドの検索順序はMethod Resolution Order(MRO)として定義されていて、インスタンスのmro()
メソッドで取得できる。
super
を使わない場合の問題として、多重継承を取り上げていて、
- 継承した順序と実際の振る舞いに整合性が必ずしもない
- ダイアモンド継承でややこしいことになる
という点を上げている。 もっとも、筆者は 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を本格的に使う企業で、このポテンシャルを買ってくれるところは無いだろうか。 まだ社会人としての経験は浅いが、第二新卒として、無いだろうか。