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