2016-07-21 5 views
1

Ich habe nie die Ausnahmebehandlung in Python (oder irgendeine andere Sprache um ehrlich zu sein) verstanden. Ich habe mit benutzerdefinierten Ausnahmen experimentiert und das folgende Verhalten gefunden.Implementierung von `Exception .__ str __()` in Python

class MyError(Exception): 
    def __init__(self, anything): 
     pass 

me = MyError("iiiiii") 
print(me) 

Ausgang:

iiiiii 

Ich gehe davon aus, dass print() Anrufe Exception.__str__(). Wie kann die Basisklasse Exceptioniiiiii drucken? Die Zeichenfolge "iiiiii" wurde über das Argument anything an den Konstruktor MyError übergeben, aber anything wird nirgendwo in MyError gespeichert.

Darüber hinaus ruft der Konstruktor MyError seinen Konstruktor der Superklasse (Exceptions) nicht auf. Also, wie hat print(me) Drucken iiiiii?

+1

Welche Version von Python? Dies kann in Python 2.7 nicht reproduziert werden. –

+0

Leider vergessen zu erwähnen, Python 3.5.1. – Ray

Antwort

1

In Python 3, die BaseException Klasse hat eine __new__ Methode, die die Argumente in self.args speichert:

>>> me.args 
('iiiiii',) 

Sie die __new__ Methode nicht außer Kraft setzen, nur __init__. Sie müßten beide außer Kraft zu setzen vollständig von self.args zu verhindern eingestellt werden, da beide Implementierungen glücklich dieses Attribut gesetzt:

>>> class MyError(Exception): 
...  def __new__(cls, *args, **kw): 
...   return super().__new__(cls) # ignoring args and kwargs! 
...  def __init__(self, *args, **kw): 
...   super().__init__()   # again ignoring args and kwargs 
... 
>>> me = MyError("iiiiii") 
>>> me 
MyError() 
>>> print(me) 

>>> me.args 
() 

In Python 2, Ausnahmen nicht implementieren __new__ und Ihre Probe würde nichts drucken. Siehe issue #1692335, warum die Methode __new__ hinzugefügt wurde; im Grunde, Probleme wie Ihre zu vermeiden, wo die __init__ Methode nicht auch super().__init__() aufrufen.

Beachten Sie, dass __init__ kein Konstruktor ist; Die Instanz ist bereits zu dieser Zeit durch __new__ aufgebaut. __init__ ist lediglich der Initialisierer.

+0

Relevantes Problem: https://bugs.python.org/issue1692335 – vaultah