2010年11月5日金曜日

Pythonのメタクラスで __new__() メソッドが必要な例

Pythonのメタクラスで __init__() メソッドではなく、__new__() メソッドを必要とする例を考えていたら、@aodagさんの「Pythonでfinalなクラス」がまさにそれだった。
イカは例によってPython 3版


#!/usr/bin/env python3.1

class FinalClass(type):
    """This metaclass works like the 'final' keyword in Java.

        >>> class Foo:
        ...     pass
        ... 
        >>> class Bar(Foo, metaclass=FinalClass):
        ...     pass
        ... 
        >>> class Baz(Bar):
        ...     pass
        ... 
        Traceback (most recent call last):
            ...
        TypeError: can't inherit from Bar 

    Original code by Atsushi Odagiri <http://aodag.posterous.com/pythonfinal>
    """

    def __new__(mcls, name, bases, dct):
        for base in bases:
            if type(base) == FinalClass:
                raise TypeError("can't inherit from {} ".format(base.__name__))
        return super().__new__(mcls, name, bases, dct)


if __name__ == "__main__":
    import doctest
    doctest.testmod()

自分のクラスが継承されたかどうかのチェックは、クラスオブジェクトを生成する前に実行すべきなので、メタクラスで __new__() メソッドを使う理由として問題は無いはず。

0 件のコメント:

コメントを投稿