6章メタクラスと属性

メタクラスは、Pythonの特長として挙げられますが、実際にそれで何ができるのか理解している人はわずかです。メタクラスという名前は漠然とクラスより上の概念を意味しています。単純化すると、メタクラスはPythonのclass文に割り込んで、クラスが定義されるたびに特別な振る舞いを与えるものです。

同様の不思議さと力を持っているのが、Pythonに組み込まれている属性アクセスを動的にカスタマイズする機能です。それらは、Pythonのオブジェクト指向機能とともに、単純なクラスから複雑なクラスへと移行する際に威力を発揮します。

しかしながら、これらの強力な機能には、落とし穴がたくさんあります。動的属性では、オブジェクトをオーバーライドして、予期しない副作用を起こします。メタクラスは、初心者には手に負えない、とても奇怪な振る舞いが生じます。驚き最小の原則に従って、これらの機構をよく理解されたイディオムを実装するためだけに使うことが重要です。

項目44 getメソッドやsetメソッドは使わず属性をそのまま使う

他の言語からPythonに移ってきたプログラマは、ごく自然にクラスの中でゲッターやセッターメソッドを明示的に実装しようとするものです。

class OldResistor:
    def __init__(self, ohms):
        self._ohms = ohms

    def get_ohms(self):
        return self._ohms

    def set_ohms(self, ohms):
        self._ohms = ohms

このゲッターやセッターの使用は単純ですが、Pythonicではありません。

r0 = OldResistor(50e3) print('Before: ...

Get Effective Python 第2版 ―Pythonプログラムを改良する90項目 now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.