Man kann tatsächlich "anonyme" Klassen in Python erstellen, da Klassen in Python, wie alles andere auch, Objekte sind. Diese Objekte können haben zufällig die Eigenschaft, selbst Objekte zu erstellen, wenn man sie aufruft, deshalb nennt man sie Klassen.
Die Klasse einer Klasse wird Metaklasse genannt. Jede Klasse hat eine Metaklasse, entweder
type oder eine Klasse, die von
type erbt. Die Klasse
type ist ihre eigene Metaklasse.
Da jede Klasse also eine Instanz einer Metaklasse ist, kann man über den Konstruktor der Metaklasse theoretisch dynamisch Klassen erstellen. Wie gesagt, theoretisch. Zum Experimentieren ist das ganz nett, aber wenn du es vermeiden kannst, solche Klassen in Produktionscode zu erstellen, dann vermeide es.
Die Syntax ist folgendermaßen:
Code: Alles auswählen
type(name: str, # Der Name der Klasse. Wird zum Attribut __name__.
bases: tuple, # Die Klassen, von denen die Klasse erbt. Wird zum Attribut __bases__.
attributes: dict # Die Attribute der Klasse. Wird zum Attribut __dict__.
)
Beispiel:
Code: Alles auswählen
>>> type('Printer', (object,), {'__init__': print})("Hello World!")
Hello World!
<__main__.Printer object at 0xabcdefabcdef>
# Äquivalent zu:
class Printer():
__init__ = print # def __init__… geht nicht in einer anonymen Klasse
Da man meines Wissens keine nicht-Lambda-Funktionen dynamisch erstellen kann, müssen die Methoden der Klasse entweder bereits definiert oder Lambda-Funktionen sein.
Auf Stack Overflow gibt es einen englischen, noch ausführlicheren Post zum Thema Metaklassen:
http://stackoverflow.com/questions/1000 ... -in-python