Rufen Sie einfach den eingebauten "Typ" mit drei Parametern auf:
ClassName = type("ClassName", (Base1, Base2,...), classdictionary)
Update
wie im Kommentar unten angegeben. Dies ist überhaupt nicht die Antwort auf diese Frage. Ich werde es nicht löschen, da es Hinweise gibt, die einige Leute hier bekommen, die versuchen, dynamisch Klassen zu erstellen - was die obige Zeile tut.
Um ein Objekt einer Klasse zu erstellen, hat man auch eine Referenz, wie in der akzeptierten Antwort angegeben, man muss nur die Klasse aufrufen:
instance = ClassObject()
Der Mechanismus für die Instanziierung ist also:
Python verwendet nicht das new
Schlüsselwort, das einige Sprachen verwenden. Stattdessen erklärt das Datenmodell den Mechanismus, der zum Erstellen einer Instanz einer Klasse verwendet wird, wenn diese mit derselben Syntax wie alle anderen aufrufbaren aufgerufen wird:
Die __call__
Methode der Klasse wird aufgerufen (im Fall einer Klasse ist ihre Klasse die "Metaklasse" - normalerweise die integrierte type
). Das normale Verhalten dieses Aufrufs besteht darin, die (pseudo) statische __new__
Methode für die zu instanziierende Klasse aufzurufen , gefolgt von ihrer __init__
. Das __new__
Verfahren ist verantwortlich für die Zuteilung von Speicher und so, und in der Regel wird durch die durchgeführt __new__
von object
dem die Klassenhierarchie Wurzel.
So ruft ClassObject()
aufruft ClassObject.__class__.call()
(die in der Regel wird type.__call__
) diese __call__
Methode classobject selbst als ersten Parameter erhalten - eine reine Python - Implementierung würde so aussehen: (die CPython Version ist natürlich in C durchgeführt und mit vielen zusätzlichen Code für cornercases und Optimierungen)
class type:
...
def __call__(cls, *args, **kw):
constructor = getattr(cls, "__new__")
instance = constructor(cls) if constructor is object.__new__ else constructor(cls, *args, **kw)
instance.__init__(cls, *args, **kw)
return instance
(Ich erinnere mich nicht, dass ich in den Dokumenten die genaue Rechtfertigung (oder den Mechanismus) für die Unterdrückung zusätzlicher Parameter an die Wurzel __new__
und die Weitergabe an andere Klassen gesehen habe - aber es ist das, was "im wirklichen Leben" passiert - wenn object.__new__
es mit zusätzlichen Parametern aufgerufen wird löst einen Typfehler aus - jede benutzerdefinierte Implementierung von a __new__
erhält jedoch normalerweise die zusätzlichen Parameter.
instance = Class()
...