2016-03-24 9 views
-1

Ich habe ein Problem beim Erstellen einer einfachen Klasse auf codewars. Ich erhalte den folgenden Fehler:Python 3.5 Fehler mit Init-Funktion nicht genügend Argumente

Traceback: in TypeError: __init__() takes exactly 3 arguments (2 given)

Ich weiß, ich die init-Funktion zusammen mit dem self Parameter mit zwei Parametern geliefert. Wenn ich mein Objekt aus meiner Klasse erstelle, gebe ich zwei Zeichenfolgen für die zwei Parameter an. Ich bin mir nicht sicher, was ich sonst falsch mache. Ist es der Codewarebrowser? Ich schätze jede Hilfe. Bitte siehe unten:

class Person: 

    def __init__(self, name, other_name): 
     self.name = name 
     self.other_name = other_name 

    def greet(self): 
     return "Hi {0}, my name is {1}".format(self.other_name, self.name) 

xy = Person("Raiden", "Donald") 
xy.greet() 

ich die anderen Fragen zu diesem Thema überprüft und es scheint immer, dass das Problem ist, dass die Person, die die Klasse aufrufen nicht mit den erforderlichen Parametern versorgen wird. Ich mache das aber. Ich schätze jede Hilfe.

EDIT ************

Es ist erwähnenswert, dass ich den obigen Code in meinem normalen Python IDLE produzieren kann. Ich habe genau diesen Code im Codewars-Fenster. Sie ist die ursprüngliche Codewarefrage: Korrigieren Sie diesen Code, damit die Begrüßungsfunktion den erwarteten Wert zurückgibt.

class Person: 
    def __init__(self, name): 
    self.name = name 

    def greet(self, other_name): 
    return "Hi {0}, my name is {1}".format(other_name, name) 
+1

Kann nicht auf Python reproduzieren 3.5.1 – vaultah

+1

Welches Codewareproblem machst du? Kannst du den Link posten? Sind Sie sicher, dass der gesamte Code im Codewars-Editorfenster vorhanden ist? – idjaw

+0

Ich habe meinen ursprünglichen Kommentar bearbeitet, um den ursprünglichen codewars Startcode plus die Frage zu enthalten. Es ist auch erwähnenswert, dass ich den ursprünglichen Code, den ich in meinem IDLE geschrieben habe, ohne Fehler reproduzieren kann. – raidboss

Antwort

1

Das Codewars-Problem gibt Ihnen Code, den Sie korrigieren müssen. Wenn Sie es einreichen, wird es gegen eine Reihe von Unittests ausgeführt, die vom Ersteller der Frage definiert werden. Hier ist der ursprüngliche Code:

class Person: 
    def __init__(self, name): 
    self.name = name 

    def greet(self, other_name): 
    return "Hi {0}, my name is {1}".format(other_name, name) 

Der Fehler, den Sie bekommen, wenn Sie diesen Code abzulegen:

Traceback: 
    in 
    in greet 
NameError: global name 'name' is not defined 

Also, mit dieser Fehlermeldung, indem Sie den Code analysiert wird, dass in der greet Methode feststellen, , Sie versuchen tatsächlich, eine Variable name zu verwenden, die tatsächlich nie definiert wurde!

Das ist eigentlich der Fehler, den Sie beheben müssen. Sie haben versucht, eine zusätzliche Variable in Ihrem init hinzuzufügen. Also, was passierte, waren die Unittests, die gegen Ihren Code liefen und erwarteten, dass nur ein einzelner Wert an Ihre init übergeben wurde.

Die Lösung für dieses Problem bestand darin, einfach die name in der greet-Methode zu self.name zu ändern, so dass es das Instanzattribut verwendet. Ihr endgültiger Code ist also ziemlich genau:

class Person: 
    def __init__(self, name): 
    self.name = name 

    def greet(self, other_name): 
    return "Hi {0}, my name is {1}".format(other_name, self.name) 
+0

Wow, vielen Dank. Das hätte ich nie verstanden. Ich hätte weiter versucht, die Sache zu komplizieren, indem ich mehr Code hinzufügte und darüber nachdachte, ob ich meine Tastatur schlagen sollte. Vielen Dank für die gründliche und detaillierte Information. Sehr geschätzt :) – raidboss

+0

@raidboss Sie sind herzlich willkommen. Viel Spaß mit Codewars. Es ist großartig. Wenn dies Ihnen geholfen hat, stellen Sie bitte sicher, dass Sie die Antwort erhalten und akzeptieren. Es hilft der nächsten Person, die ähnliche Hilfe sucht, zu wissen, dass dies hilfreich war. Prost und viel Glück! – idjaw

+0

mein Schlechter, ich überprüfte beide, da sie beide technisch die Frage beantworteten. Ich wusste nicht, dass nur ein Scheck zutreffen könnte. Ich habe deine Antwort markiert, denn das war eine großartige und gründliche Erklärung. Hoffe, dass andere davon profitieren können. Danke noch einmal! – raidboss

0

Codewars laufen Testfälle auf Ihrem Code zu sehen, ob Sie bei der Festsetzung des gegebenen Code gelungen. Alle diese Testfälle setzen voraus, dass der Person-Konstruktor ein Positionsargument verwendet. Da Sie die Signatur von Person.__init__ so geändert haben, dass zwei Positionsargumente erforderlich sind, wird jeder Testfall den Bericht TypeError ausgeben.

Um den bereitgestellten Code zu korrigieren, überlegen Sie, ob in der greet-Methode eine lokale Variable mit dem Namen name vorhanden ist.

+0

Vielen Dank :) – raidboss

Verwandte Themen