Pythonでfinalなクラス

From Evernote:

Pythonでfinalなクラス

Javaだと、final class ってやると、継承できないクラスを定義できるよね。
Pythonでそんなクラス作る必要があるかどうかはおいといて、Expert Python読書会で作れるかどうかって話があったらしいから、メタクラスでやってみるよ

finalclass.py ::

class FinalClass(type):
    def __init__(cls, name, bases, dct):
        super(FinalClass, cls).__init__(name, bases, dct)
        for b in bases:
            if b.__class__ == FinalClass:
                raise TypeError, "%s: can't inherit %s" % (name, b.__name__)

class Foo(object):
    """
    """

class Bar(Foo):
    __metaclass__ = FinalClass

class Baz(Bar):
    """ """

FinalClassがメタクラスになってて、BarクラスやBazクラスが定義(メタクラスからクラスが生成される)ときにFinalClassのコンストラクタが呼び出される。
ここで、スーパークラスのリストが引数で渡されるので、その中にFinalClassのインスタンスが存在したら、エラーにしている。

実行結果
% python finalclass.py
Traceback (most recent call last):
  File "finalclass.py", line 16, in <module>
    class Baz(Bar):
  File "finalclass.py", line 6, in __init__
    raise TypeError, "%s: can't inherit %s" % (name, b.__name__)
TypeError: Baz: can't inherite Bar

追記
つづり間違いの指摘があったので修正 inherite -> inherit