È necessario sovrascrivere __call__
sul metaclasse. I metodi speciali definiti in una classe sono per le sue istanze, per cambiare i metodi speciali di una classe è necessario cambiarli nella sua classe, cioè la metaclasse. (Quando si chiama Foo()
di solito l'ordine è: Meta.__call__()
->Foo.__new__()
->Foo.__init__()
, solo se tornano normalmente)
class Meta(type):
@staticmethod
def __call__():
return '__call__'
class Foo(object):
__metaclass__ = Meta
@staticmethod
def bar():
return 'bar'
print Foo()
#__call__
Come si sta cercando di modificare la classe di un'istanza, un altro modo sarà per ignorare __new__
sulla classe stessa e tornare __call__
da esso (quando __new__
restituisce qualcosa di diverso da un'istanza del metodo __init__
non viene mai chiamato):
class Foo(object):
def __new__(*args):
#ignore the args
return '__call__'
@staticmethod
def bar():
return 'bar'
print Foo()
#__call__
fonte
2014-11-07 03:39:09
Grazie! Questo lo risolve per me. Cosa intendi con 'Meta .__ call __()' -> 'Foo .__ new __()' -> 'Foo .__ init __()'? Le frecce significano "chiamate"? – fragapanagos
@fragapanagos Questo è l'ordine seguito da Python quando viene creata un'istanza di una classe. Vedi: http://ideone.com/4gxeiN –