2016-03-20 7 views
1

Angenommen, ich habe eine Klasse mit einem Konstruktor definiert.Python - Konstruktor Argumente Argumente ohne Instanziierung

class Person: 

    def __init__(self, name="", age=0): 
     self.__name = name 
     self.__age = age 

Nun würde Ich mag eine Instanz von Person machen, aber nehme an, dass ich vergessen, was ich an den Konstruktor übergeben sollte. Da ich Standardargumente definiert habe, kann ich

dummy_person = Person() 
print dummy_person.__init__.__code__.co_varnames 

Was ich sehen lassen, was die Argumente sind, so dass ich ein neues Person machen kann, dieses Mal den entsprechenden Namen und das Alter übergeben.

Die Frage ist: Wie kann ich ein ähnliches Ergebnis erreichen, ohne zuerst eine dummy_person instanziieren zu müssen? Mit anderen Worten: Kann ich auf die Argumentliste des Konstruktors zugreifen, indem ich nur den Klassennamen kenne?

Bearbeiten: Hier ist, wie ich diese Funktion verwenden möchte.

args_names = CircleTrajectory.__init__.__code__.co_varnames[1:] 
args = {} 
for arg_name in args_names: 
    args.append(float(input("Insert " + arg_name + ": "))) 

my_circle = CircleTrajectory(*args) 

Damit dies funktioniert, müssen wir eine CircleTrajectory Klasse definiert haben, und wir müssen davon ausgehen, dass alle Parameter ihres Baumeisters Schwimmer sind. Die letzte Annahme gefällt mir nicht besonders, aber ich denke, es ist sicher, da alle diese Objekte vom Endbenutzer erstellt werden müssen, indem die Werte in einer GUI eingegeben werden.

+1

whle können Sie das tun, es scheint, wie Sie hier eine falsche Frage stellen, da dies scheint eine vermasselte Lösung zu sein. Könnten Sie den gesamten Anwendungsfall, der davon betroffen ist, teilen? –

+0

Wenn Sie eine Instanz aus Benutzereingaben erstellen möchten, sollte diese Logik nicht Teil der Klasse selbst sein (das ist rhetorische Frage; die Antwort ist ja)? Ziehen Sie es in Erwägung, es zu einer Klassenmethode zu machen, statt mit Introspektion herumzulaufen ('my_circle = CircleTrajectory.from_input()'), vor allem da Sie nicht erkennen können, welche Art von Eingabe von außen benötigt wird. – jonrsharpe

+0

Nun, jetzt, wo Sie es erwähnen, sicher! Das eröffnet hier eine ganz neue Welt der Möglichkeiten. Ich habe noch einen kleinen Zweifel: Ist die 'from_input' Methode eine' @ classmethod', und ruft sie darin einen Konstruktor auf? – Antonio

Antwort

0

Zugriff einfach die gleichen Eigenschaften auf der tatsächlichen Klasse Person:

>>> Person.__init__.__code__.co_varnames 
('self', 'name', 'age') 
+0

Großartig, funktioniert für mich! Aber ich bin wirklich überrascht, dass es funktioniert. Schließlich ist "__init__" kein '@ staticmethod' oder' @ classmethod'; im Gegenteil, es ist an die bestimmte Instanz gebunden. Ich denke, hier handelt es sich um "__init__" als Stück Code, eher als Funktionsaufruf. Jede weitere Einsicht würde geschätzt werden. – Antonio

+1

@Antonio-Instanzmethoden sind in der Klasse vor der Instanziierung noch vorhanden. – jonrsharpe

+0

@jonrsharpe hat recht; Schließlich muss "__init__" vorhanden sein, damit es beim erstmaligen Instanziieren aufgerufen werden kann. –

0

können Sie verwenden help(Person) oder help(Person.__init__)