Ich möchte Klassenattribute dynamisch zu einer Superklasse hinzufügen. Außerdem möchte ich Klassen erstellen, die dynamisch von dieser Oberklasse erben, und der Name dieser Unterklassen sollte von Benutzereingaben abhängen.Python: Klassenfabrik verwendet Benutzereingaben als Klassennamen
Es gibt eine Oberklasse "Unit", zu der ich zur Laufzeit Attribute hinzufügen kann. Das funktioniert schon.
def add_attr (cls, name, value):
setattr(cls, name, value)
class Unit(object):
pass
class Archer(Unit):
pass
myArcher = Archer()
add_attr(Unit, 'strength', 5)
print "Strenght ofmyarcher: " + str(myArcher.strength)
Unit.strength = 2
print "Strenght ofmyarcher: " + str(myArcher.strength)
Dies führt zu der gewünschten Ausgabe:
Strenght ofmyarcher: 5
Strenght ofmyarcher: 2
Aber jetzt will ich nicht die Unterklasse Archer vordefinieren, aber ich würde lieber lassen die Benutzer entscheiden, wie diese Unterklasse aufgerufen wird. Ich habe etwas wie dieses versucht:
aber kein Glück. Ich glaube, ich habe nicht wirklich verstanden, was neue hier tut. Was ich als Ergebnis hier will, ist
class Soldier(Unit):
pass
vom Werk geschaffen. Und wenn ich die Fabrik mit dem Argument "Ritter" anrufe, möchte ich, dass ein Klassenritter, eine Unterklasse der Einheit, erstellt wird.
Irgendwelche Ideen? Vielen Dank im Voraus!
Bye
-Sano
Danke Devin! Sowohl Ihre als auch Felix 'Lösung scheint einen Nebeneffekt zu haben, den ich nicht berücksichtigt habe: Die neue Klasse ist ein Objekt und muss an etwas angehängt werden - gespeichert in einer Variablen oder angehängt an eine Liste oder etwas. Ich kann nicht einfach die Knight-Klasse erstellen und dann den Konstruktor mit myKnight = Knight() aufrufen. Eher muss ich etwas tun: unitlist.append (meta ("Knight")) myKnight = unitlist [0]() Gibt es einen Weg um dies zu erreichen? Um es klar zu sagen: Speichern Sie die Knight-Klasse an der gleichen "allgemeinen Position" die Unit-Klasse wird gespeichert, wenn die Definition im Code erreicht ist? – Sano98
@ Sano98: Ich bin mir nicht sicher, was du meinst. Du kannst 'Knight = meta (" Knight ")' machen und dann 'myKnight = Knight()'. Was genau willst du? –
Danke, genau das möchte ich machen! Speichern Sie es einfach unter Knight ... Und dann ist es im globalen Namespace und ich kann die Klasse verwenden, als wäre sie fest codiert. Grosses Dankeschön. Ich dachte nur nicht, dass ich Knight() anrufen könnte, wenn ich die Klasse als Ritter rette, aber sicher, warum nicht? – Sano98