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