class MyMeta(type):
def __new__(meta, cls, bases, attributes):
print 'MyMeta.__new__'
return type.__new__(meta, cls, bases, attributes)
def __init__(clsobj, cls, bases, attributes):
print 'MyMeta.__init__'
class MyClass(object):
__metaclass__ = MyMeta
foo = 'bar'
Un altro modo per raggiungere lo stesso risultato:
cls = "MyClass"
bases =()
attributes = {'foo': 'bar'}
MyClass = MyMeta(cls, bases, attributes)
MyMeta
è un callable quindi Python utilizzerà il metodo speciale __call__
.
Python cercherà __call__
in s' tipo il MyMeta
(che è type
nel nostro caso)
"Per classi di nuovo stile, invocazioni implicite di metodi speciali sono garantiti solo per funzionare correttamente se definita il tipo di un oggetto, non nel dizionario dell'istanza dell'oggetto"
MyClass = MyMeta(...)
viene interpretato come:
my_meta_type = type(MyMeta)
MyClass = my_meta_type.__call__(MyMeta, cls, bases, attributes)
All'interno del type.__call__()
immagino qualcosa di simile:
MyClass = MyMeta.__new__(MyMeta, cls, bases, attributes)
meta_class = MyClass.__metaclass__
meta_class.__init__(MyClass, cls, bases, attributes)
return MyClass
MyMeta.__new__()
deciderà come il MyClass
è costruito:
type.__new__(meta, cls, bases, attributes)
imposterà la metaclasse corretto (che è MyMeta
) per MyClass
type(cls, bases, attributes)
imposterà il metaclasse predefinito (che è il tipo) per MyClass
Ma questa è la domanda che voglio dire: perché non 'type' restituire il giusto tipo di oggetto? So che devo usare il metodo '__new__' della sottoclasse, ma com'è diverso dall'uso di' type'? –
In che modo si suppone che il tipo sappia magicamente quale tipo di oggetto si desidera creare? –
bene, perché lo dico. Ho passato in nome, basi e dettato. Quale altra informazione ho bisogno di dargli? –