Python Alle Klassen innerhalb eines Moduls instanziieren [duplizieren]

8

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:

%Vor%

Gibt es eine Möglichkeit, dies zu tun, ohne die Klassen einzeln durch Eingabe ihrer Namen instanziieren zu müssen?

    
Jake Hyun 01.01.2016, 09:03
quelle

2 Antworten

6

Lösung

Das funktioniert:

%Vor%

druckt:

%Vor%

Schritte

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:

  1. obj is not Action - Da Action eine Unterklasse von sich selbst ist, müssen wir sie ausfiltern.

  2. isinstance(obj, type) - Das Objekt muss eine Klasse sein. Ansonsten wäre der Test unter 3. nicht möglich.

  3. 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%

Kürzere Version

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%     
Mike Müller 01.01.2016, 09:15
quelle
1
%Vor%     
kia 01.01.2016 09:15
quelle

Tags und Links