Ich arbeite an einem textbasierten Abenteuerspiel und habe ein Modul mit allen Aktionsklassen, z. Move(Action)
, Look(Action)
. Ich brauche eine Methode, alle Klassen in dem Modul, das eine Unterklasse der Klasse Action
ist, in eine Liste wie folgt zu instanziieren:
Gibt es eine Möglichkeit, dies zu tun, ohne die Klassen einzeln durch Eingabe ihrer Namen instanziieren zu müssen?
Das funktioniert:
%Vor%druckt:
%Vor%Zuerst erhalten wir alle Namen als ein Objekt im aktuellen Modul:
%Vor% Wir müssen in eine Liste konvertieren, weil in Python 3 items()
ein dictview-Objekt zurückgibt, das Änderungen im darunterliegenden Wörterbuch widerspiegelt. Da wir im selben Modul arbeiten, ändert die Definition neuer Objekte dieses Wörterbuch. Das Konvertieren in eine Liste löst dieses Problem.
Als nächstes gehen wir durch alle Objekte. Es gibt drei Bedingungen, die erfüllt sein müssen, um eine Unterklasse von Action
zu sein:
obj is not Action
- Da Action
eine Unterklasse von sich selbst ist, müssen wir sie ausfiltern.
isinstance(obj, type)
- Das Objekt muss eine Klasse sein. Ansonsten wäre der Test unter 3. nicht möglich.
issubclass(obj, Action)
- Schließlich können wir unseren Unterklasse-Test durchführen.
Nun können wir Instanzen aller gefilterten Klassen erstellen und sie an unsere Liste anhängen:
%Vor%Wenn Sie sicher sind, dass alle Klassen in einem Modul definiert sind oder Sie sogar alle Unterklassen haben möchten, die auf mehrere Module verteilt sind, wäre dies viel kürzer:
%Vor%Tags und Links python python-3.5 adventure