サブクラスを追跡する汎用メタクラスを作成しようとしています
これを汎用にしたいので、このメタクラス内にクラス名をハードコーディングしたくなかったので、次のような適切なメタクラスを生成する関数を考え出しました。
def make_subtracker(root):
class SubclassTracker(type):
def __init__(cls, name, bases, dct):
print('registering %s' % (name,))
root._registry.append(cls)
super(SubclassTracker, cls).__init__(name, bases, dct)
return SubclassTracker
このようにして、特定のルートクラスのメタクラスを生成するために呼び出すことができます。
__metaclass__ = make_subtracker(Root)
ここで私は問題にぶつかります。これはできない:
class Root(object):
_registry = []
__metaclass__ = make_subtracker(Root)
...Root
使用するときはまだ定義されていないためmake_subtracker(Root)
。少なくともサブクラスに適用できるように、後で __metaclass__ 属性を追加してみました。
class Root(object):
_registry = []
Root.__metaclass__ = make_subtracker(Root)
...しかし、これは機能しません。__metaclass__ には、クラス作成のカスタマイズで定義されているように、クラス定義が読み込まれるときに特別な処理があります。
これを行うための提案を探しています(実行時にクラスのメタクラスを変更して、サブクラスに適用するか、その他の代替手段を使用します)。