11/29にギークラボ長野で開催された、NSEGの「オブジェクト指向設計実践ガイド」読書会の第7回に参加しました。
ここ数回参加できていなかったので、今回参加できて良かったです。
今回は第7章を読みました。今回はモジュールの話でした。
第5,6章に関連するところもあり、その章について教えてもらいながら読み進めました。
今回Rubyに詳しい方がいらっしゃらなかったため、
- method_missing
- extend
- 特異クラス
については、また後日識者の方にお尋ねしたいと思いました。
なお、週末には「ながのRubyの会 #1」が開催されます。 naruby.connpass.com
ところで、Rubyのモジュールで思い出したのは、PythonのMixinでした。
このページにもある通り、Djangoとかで見かけます。
Django Class-Based-View Inspector -- Classy CBV
たとえば、
mixin_example.py
class FooMixin: def hello(self): print('hello Foo') def call(self): print('call Foo') class BarMixin: def hello(self): print('hello Bar') def call(self): print('call Bar') class Baz(FooMixin, BarMixin): def hello(self): print('hello Baz') if __name__ == '__main__': baz = Baz() baz.hello() baz.call()
と、
- Mixinが2つ
- Bazクラスは両方のMixinクラスを継承
というソースコードがあるとします。
この場合、実行してみると、
$ python mixin_example.py hello Baz call Foo
のように、
- クラスにメソッドがあれば、そのクラスのものを使う
- Mixinしたクラスの両方にメソッドがあれば、Mixinの順番(左が優先)で使われる
となります*1。
このあたりの話は以下が詳しく、参考になりました。
The History of Python.jp: メソッド解決順序(MRO)
*1:読書会の時はうろ覚えですみませんでした