Das kann nicht funktionieren. 1.) klassen mit metaklassen müssen object sein. 2.) hast du das system der Metaklasse nicht verstanden, da wird nix weitergeleitet.
Vielleicht hiflt dir das:
Code: Alles auswählen
class Meta(type):
def __new__(cls, name, bases, d):
print 'Meta.__new__'
result = type.__new__(cls, name, bases, d)
def __init(self):
print 'Meta.__init__'
def __call(self):
print 'Meta.__call__'
setattr(result, '__init__', __init)
setattr(result, '__call__', __call)
return result
class BetterMeta(type):
def __new__(cls, name, bases, d):
print 'BetterMeta.__new__'
result = type.__new__(cls, name, bases, d)
def __init(self, *args, **kwargs):
print 'BetterMeta.__init__'
if '__init__' in d:
d['__init__'](self, *args, **kwargs)
def __call(self, *args, **kwargs):
print 'BetterMeta.__call__'
if '__call__' in d:
d['__call__'](self, *args, **kwargs)
setattr(result, '__init__', __init)
setattr(result, '__call__', __call)
return result
class Foo(object):
__metaclass__ = Meta
class BetterFoo(object):
__metaclass__ = BetterMeta
def __call__(self):
print 'BetterFoo.__call__'
if __name__ == '__main__':
print '> erstelle foo'
f = Foo()
print '> rufe foo auf'
f()
print '> erstelle betterfoo'
f2 = BetterFoo()
print '> rufe betterfoo auf'
f2()
Ausgabe:
Code: Alles auswählen
blackbird@volverine:~/Developement/area51$ python metacls.py
Meta.__new__
BetterMeta.__new__
> erstelle foo
Meta.__init__
> rufe foo auf
Meta.__call__
> erstelle betterfoo
BetterMeta.__init__
> rufe betterfoo auf
BetterMeta.__call__
BetterFoo.__call__