2016-09-15 3 views
5

ist ein im alten Stil Klasse:Unterklassifizieren von Objekt genauso wie Definieren von Typ als Metaklasse? Diese

class OldStyle: 
    pass 

Dies ist ein neuer Stil Klasse:

class NewStyle(object): 
    pass 

Dies ist auch eine neue Stil-Klasse:

class NewStyle2: 
    __metaclass__ = type 

Gibt es ein Unterschied zwischen NewStyle und NewStyle2?

Ich habe den Eindruck, dass der einzige Effekt der Erben von object eigentlich ist, die type Metaklasse zu definieren, aber ich kann keine Bestätigung dafür finden, außer dass ich keinen Unterschied sehe.

Antwort

2

Ziemlich viel ja, es gibt keinen Unterschied zwischen NewStyle und NewStyle2. Beide sind vom Typ type während OldStyle vom Typ classobj.

Wenn Sie von Objekt ableiten, die __class__ of object (meaning type) is going zu verwenden; wenn Sie eine __metaclass__ that is going to get picked up liefern.

Wenn nichts geliefert wird als __metaclass__ und Sie erben nicht von object, Py_ClassType is assigned as the metaclass für Sie. In allen Fällen wird metaclass.__new__ aufgerufen werden. Für Py_ClassType.__new__ folgt die Semantik definiert (ich habe sie nie wirklich untersucht) und für type.__new__ it makes sure to pack object in den Grundlagen Ihrer Klasse.

Natürlich kann ein ähnlicher Effekt wird erreicht durch:

cls = type("NewStyle3",(), {}) 

wo ein Anruf sofort zu type gemacht wird; es ist nur ein größerer Aufwand :-)

Verwandte Themen