単調減少の恐怖
去る2016年5月28日に品川区立五反田文化センターにて『Effective Python 読書会 #3』を開催しました。 前回同様(会議室のキャパシティである)18人規模で開催し、10名の参加者でした。 発表者枠の無断キャンセルはさすがにつらい…。
項目25「親クラスをsuper
を使って初期化する」について
『Effective Python』の項目25のP.71L.-5に次のような記述がある。
MROは、どのスーパークラスが他より前に(例えば、深さ優先、左から右)初期化されるかを標準化しました。 さらに、ダイヤモンド継承の共通のスーパークラスが一度しか実行されないことを保証しました。
ここで、「深さ優先、左から右」とあるが、違うのではという話になり、調べたところMROはC3 linearizationというアルゴリズムで規定されているみたいです。
C3 linearization - Wikipedia, the free encyclopedia
つまり、
(例えば、深さ優先、左から右)
という記述は本当にたとえ話であり、アルゴリズムで一意に決まっているよ、という話に過ぎないという点です。
最も、項目26「多重継承はmix-inユーティリティクラスだけに使う」P.74 L.1に
Pythonは、多重継承を使いやすくする組み込み機能を備えたオブジェクト指向言語です(中略)。しかし、多重継承はそもそも避けた方が賢明です。
とある通り、筆者は多重継承はmix-inのみに限定した方がよいと主張しています。
(項目25は組み込み函数super
の効用を主張している)
次回予定
次回も五反田文化センターで5月28日18時から開催します。
pythonbookreading.connpass.com
3章の続きと4章を読み進める予定です。 ペースメーカーとして、理解が正しいかどうかのリトマス紙として、ご利用ください。
追記
筆者であるBrettさんからTwitterでリプライが届き、表記を変更するよ、というコメントをいただいました。
項目25で重要なのは
The only things that are important here are 1) that there's a standardized ordering, and 2) that superclasses are only initialized once.
の通り、
です。