Вы должны переопределить __call__
на метакласса. Специальные методы, определенные в классе, предназначены для его экземпляров, чтобы изменить специальные методы класса, необходимые для их изменения в своем классе, то есть в метаклассе. (При вызове Foo()
обычно заказ: Meta.__call__()
->Foo.__new__()
->Foo.__init__()
, только если они вернутся нормально)
class Meta(type):
@staticmethod
def __call__():
return '__call__'
class Foo(object):
__metaclass__ = Meta
@staticmethod
def bar():
return 'bar'
print Foo()
#__call__
Как вы пытаетесь изменить класс экземпляра, другой путь будет переопределить __new__
на самом классе и вернуть __call__
из него (когда __new__
возвращает нечто иное, чем, например метод __init__
никогда не называется):
class Foo(object):
def __new__(*args):
#ignore the args
return '__call__'
@staticmethod
def bar():
return 'bar'
print Foo()
#__call__
Спасибо! Это очищает меня. Что вы подразумеваете под 'Meta .__ call __()' -> 'Foo .__ new __()' -> 'Foo .__ init __()'? Соответствуют ли стрелки «звонки»? – fragapanagos
@fragapanagos Вот такой порядок, за которым следует Python при создании экземпляра класса. См .: http://ideone.com/4gxeiN –