2016-11-22 1 views
0

ich den folgenden einfachen Code haben:Raise Typeerror in Klasse

class testing: 
    def __init__(self, arg1, arg2, arg3): 
     self.arg1 = arg1 
     self.arg2 = arg2 
     self.arg3 = arg3 

if __name__ == '__main__': 
    arg_1 = testing("a", "b", "c") 

Wenn ich ausführen es alles funktioniert gut, aber wenn ich erhöhen arg_1 mit "d" wie folgt aus:

if __name__ == '__main__': 
    arg_1 = testing("a", "b", "c", "d") 

Ich erhalte die folgende Fehler :

TypeError: __init__() takes 4 positional arguments but 5 were given 

Jetzt möchte ich eine Ausnahme auslösen:

class testing: 
    def __init__(self, arg1, arg2, arg3): 
     try: 
      self.arg1 = arg1 
      self.arg2 = arg2 
      self.arg3 = arg3 
     except TypeError: 
      print("Error, to many values") 

if __name__ == '__main__': 
    arg_1 = testing("a", "b", "c", "d") 

Ich bekomme die gleiche Fehlermeldung. Was mache ich falsch?

Antwort

2

self wird implizit während des Aufrufs zur Initialisierung übergeben. Die try-except wird nicht einmal ausgeführt, der Fehler tritt auf, wenn der Anruf gemacht wird. Sie haben drei zusätzliche Argumente angegeben, nicht vier.

Wenn Sie Notwendigkeit zu überprüfen, dass Sie die Anruf wickeln sollte gemacht, wenn Sie in einem try-except initialisieren:

if __name__ == '__main__': 
    try: 
     arg_1 = testing("a", "b", "c", "d") 
    except TypeError: 
     print("Error, to many values") 

für welchen Zweck auch immer Sie brauchen.

1

Python wirft einen Fehler, wenn versucht wird, init() aufzurufen, damit Ihr benutzerdefinierter Fehler nie erreicht wird. Wenn Sie in diesem Fall einen benutzerdefinierten Fehler verwenden möchten, müssen Sie variable Argumentlängen mit * Argumenten unterstützen.

class testing: 
    def __init__(self, *args): 
     if len(args) > 3: 
      print("Error, too many values") 
      return 
     self.arg1 = args[0] 
     self.arg2 = args[1] 
     self.arg3 = args[2] 

if __name__ == '__main__': 
    arg_1 = testing("a", "b", "c")