クラス (デフォルト) は のインスタンスですtype。クラスのインスタンスFooが によって作成されるfoo = Foo(...)ように、 のインスタンスtype(つまり、クラス) は によって作成されmyclass = type(name, bases, clsdict)ます。
クラス作成の瞬間に何か特別なことをしたい場合は、クラスを作成するものを変更する必要があります-つまりtype. その方法は、サブクラス、typeつまりメタクラスを定義することです。
クラスがそのインスタンスに対するものであるように、メタクラスはそのクラスに対するものです。
Python2 では、クラスのメタクラスを次のように定義します。
class SuperClass:
__metaclass__ = Watcher
はWatcherのサブクラスですtype。
Python3 では、構文が次のように変更されました。
class SuperClass(metaclass=Watcher)
両方とも同等です
Superclass = Watcher(name, bases, clsdict)
この場合、は stringにname等しく、は tupleです。は、クラス定義の本体で定義されたクラス属性のディクショナリです。'Superclass'bases(object, )clsdict
との類似性に注意してくださいmyclass = type(name, bases, clsdict)。
__init__したがって、インスタンスの作成時にクラスを使用してイベントを制御するのと同じように、クラスの作成時にメタクラスの を使用してイベントを制御でき__init__ます。
class Watcher(type):
def __init__(cls, name, bases, clsdict):
if len(cls.mro()) > 2:
print("was subclassed by " + name)
super(Watcher, cls).__init__(name, bases, clsdict)
class SuperClass:
__metaclass__ = Watcher
print("foo")
class SubClass0(SuperClass):
pass
print("bar")
class SubClass1(SuperClass):
print("test")
版画
foo
was subclassed by SubClass0
bar
test
was subclassed by SubClass1