イカは例によって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 件のコメント:
コメントを投稿