旧スタイルクラスと新スタイルクラス

Pythonクックブック 第2版』の6章 オブジェクト指向プログラミングのイントロダクションを読んでいて重要な部分があったのでメモ。

従来のクラスではsuperは使えないので、多重継承を重要な用途で使うことは実質一切してはならない。..(snip)..
たとえばpropertyのようなビルトインが、従来のクラスでは完全には動作しない(一応は動く)。

superに関しては個人的に奥が深いと思っているので時間あるときに記事にまとめたい。

クラスを定義しているモジュール全てで頭のところに次の代入文を書いてやると、クラス全てでobjectを継承するように明示的に書くのと同等のことが実現できる:

__metaclass__ = type

..(snip)..
基底クラスを持たないクラスはモジュールがグローバル変数__metaclass__からメタクラスを得られる。

旧スタイルクラスと新スタイルクラスの違いは、メタクラスの違いなのでこういうことが可能。Python 3.0から新スタイルクラスのみになるので、class Foo(object):の(object)の部分が不要になる。3.0以前で全てに(object)を付けてしまうと、3.0以降では削除しないといけなくなるが、メタクラスを制御する方法ならよりスマートだと思った。