クラス (デフォルト) は のインスタンスです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