2016-08-06 6 views
-1

Ich schrieb diesen Code, um auf ein Objekt über Benutzereingabe zuzugreifen. Es arbeitet mit Einheimischen (ich weiß, ich kann Wörterbuch machen)Wie erhält man zwei Eingaben und greift auf Objekte und Methoden einer Klasse zu?

class Dragon: 

    def __init__(self, head, legs): 
     self.head = head 
     self.legs = legs 

    def sum(self): 
     return self.head + self.legs 


redfire = Dragon(2, 4) 
dic1 = {"redfire": redfire} 
input_object = input() 
print(dic1[input_object].sum()) 

aber wenn ich versuche, das gleiche mit Methoden der Klasse zu tun:

class Dragon: 

    def __init__(self, head, legs): 
     self.head = head 
     self.legs = legs 

    def sum(self): 
     return self.head + self.legs 

    def mul(self): 
     return self.head * self.legs 


redfire = Dragon(2, 4) 
dic1 = {"redfire": redfire, "sum": Dragon.sum(self), "mul": Dragon.mul} 
input_object = input() 
input_method = input() 
print(dic1[input_object].dic1[input_method]) 

Ich bekomme alle Arten von Fehler fragen mich, mein Wörterbuch zu ändern:

Traceback (most recent call last): 
    File "C:\Users\millw0rm\test.py", line 10, in <module> 
    dic1 = {"redfire": redfire, "sum": Dragon.sum(self), "mul": Dragon.mul} 
NameError: name 'self' is not defined 

Was kann ich einen gültigen Schlüssel für meine Methoden in meinem Wörterbuch definieren?

+0

warum 'Dragon.sum'? Sie haben die 'redfire' -Instanz bereits erstellt, warum fügen Sie sie nicht dem Diktat hinzu? In diesem Fall wird "self" implizit übergeben. Oder füge 'Dragon hinzu.sum (redfire) 'was eine alberne Art ist, das ** genaue ** Gleiche zu tun. –

+0

Möchten Sie 'getattr (dic1 [input_object], input_method)()'? – jonrsharpe

+0

eigentlich habe ich keine Ahnung, was ich mit dieser Methode Teil in dictionary.look gemacht habe, stellen Sie sich vor, Sie haben mehrere Klassen mit mehreren Methoden in ihnen und Sie haben eine Reihe von Objekten, wie Sie ein Stück Code schreiben Benutzer nach einem gewünschten Objekt und eine Methode seiner Klasse, um eine Operation auf Attribute dieses Objekts durchzuführen. wie in diesem hier bekomme ich das objekt redfire und danach wollte ich methode sum von einem eingang bekommen um die operation zu machen. – Millw0

Antwort

0

Sie verwenden Klassenmethode nicht zu Recht:

redfire = Dragon(2, 4) 
dic1 = {"redfire": redfire, "sum": Dragon.sum(self), "mul": Dragon.mul} 

In der Tat, Funktionsdefinition in Ihrer Klasse: def sum(self):, selbst zu einem Objekt der Klasse verweisen.

Sie sollten es dann wie folgt verwenden:

# Create one dragon 
redfire = Dragon(2, 4) 
# Enter the dragon in the dict 
dic1 = {"redfire": redfire, "sum": redfire.sum(), "mul": redfire.mul()} 

Daher Sie verwenden redfire.sum(), die im Grunde sum() Funktion auf das Objekt wird mit redfire, dass ein Dragon Objekt ist.

Für den zweiten Teil Ihrer Arbeit: print(dic1[input_object].dic1[input_method]), müssen Sie auf eine Funktion, einen Verweis speichern:

sum_method = Dragon.sum 
sum_redfire = sum_method(redfire) 

Finaly erhalten wir:

redfire = Dragon(2, 4) 
sum_method = Dragon.sum 
dict1 = {"redfire": redfire, "sum": sum_method} 
input_object = input() 
input_method = input() 
print(dict1[input_method](dict1[input_object])) 
+0

Xavier das nicht was ich fragen möchte ich sowohl Objekte und Methoden von Benutzer .image wenn ich wie 1000 Objekte haben! kann nicht ein Wörterbuch so groß machen. und übrigens mit dem Ersetzen Ihres Codes bekomme ich immer noch einen Fehler AttributError: 'Dragon' Objekt hat kein Attribut 'dic1' – Millw0

+0

Millw0 habe einen Teil meiner Antwort hinzufügen, das sollte Ihnen helfen, sagen Sie mir, wenn es nicht genug ist:) –

0

Es gibt keinen Grund, die Methoden in dem Speicher Wörterbuch: Sie sind bereits in der Dragon-Klasse selbst gespeichert. Wie jonrsharpe in den Kommentaren erwähnt, können Sie die integrierte Funktion getattr verwenden, um ein Attribut einer Klasseninstanz abzurufen. das gilt für Methoden wie Ihre sum und mul sowie die einfachen head und legs Attribute.

Hier ist eine überarbeitete Version Ihres Codes, die Sie nützlich finden werden. Ich habe der Klasse eine __repr__-Methode hinzugefügt, sodass wir nützliche Informationen erhalten, wenn wir eine Dragon-Instanz drucken.

class Dragon: 
    def __init__(self, head, legs): 
     self.head = head 
     self.legs = legs 

    def sum(self): 
     return self.head + self.legs 

    def mul(self): 
     return self.head * self.legs 

    def __repr__(self): 
     return 'Dragon({}, {})'.format(self.head, self.legs) 

dragons = {} 
dragons["redfire"] = Dragon(2, 4) 
dragons["greenfire"] = Dragon(1, 2) 
print(dragons) 

name = input("name: ") 
method_name = input("method: ") 
d = dragons[name] 
method = getattr(d, method_name) 
print(d, method())  

Test

{'redfire': Dragon(2, 4), 'greenfire': Dragon(1, 2)} 
name: redfire 
method: sum 
Dragon(2, 4) 6 

Natürlich können Sie könnte schaffen die dragons Wörterbuch wie folgt aus:

dragons = { 
    "redfire": Dragon(2, 4), 
    "greenfire": Dragon(1, 2), 
} 
+0

das ist rate rate nicht, dass d in der letzten Zeile ... Sie können überprüfen, meine modifizierten Code im Klassennamen von Objekten in z-Wert und lol fragte Einheimischen() für ein kleines bisschen Hilfe – Millw0

+0

@ Millw0 Sicher, die letzten 3 Zeilen in meinem ersten Codeblock _kann auf

0

vor allem so viel everbody Dank jonrsharp und PM 2Ring für getattr Erwähnens() Funktion. Code unten ist was ich suchte für

class Dragon: 
    def __init__(self,head,tail): 
     self.head=head 
     self.tail=tail 
    def sum(self): 
     return (self.head + self.tail) 
class Snake: 
    def __init__(self,head,tail): 
     self.head=head 
     self.tail=tail 
    def sum(self): 
     return (self.head * self.tail) 
python=Snake(1,1) 
anakonda=Snake(3,5)  
redfire=Dragon(2,4) 
hellfly=Dragon(2,10) 
x=input() 
y=input() 
z=objectdic[x].__class__.__name__ 
print(getattr(locals()[z],y)(locals()[x])) 
+0

Es ist keine gute Idee, 'localhosts()' zu verwenden, es sei denn, du machst etwas Besonderes, das _really_ benötigt, und du brauchst es hier nicht. Die Verwendung von 'locals()' erschwert das Lesen des Codes (was die Pflege erschwert). –

Verwandte Themen