2014-09-03 12 views
5
übergeben werden.

Hier ist ein Code, der zeigt, worüber ich spreche.Python ignoriert Standardwerte von Argumenten, die dem Tupel in der geerbten Klasse

class Foo(tuple): 
    def __init__(self, initialValue=(0,0)): 
     super(tuple, self).__init__(initialValue) 

print Foo() 
print Foo((0, 0)) 

würde ich beide Ausdrücke erwarten genau das gleiche Ergebnis zu erzielen, aber die Ausgabe dieses Programms ist:

() 
(0, 0) 

Was soll ich hier nicht zu verstehen?

+1

Ich glaube, dass [diese Antwort] (http://stackoverflow.com/questions/3120562/python-subclassing-immugutable-types) aufschlussreich sein könnte. – Amadan

Antwort

10

Das ist, weil die tuple Art nicht die Argumente zu __init__, aber nur über diese zu __new__ interessiert. Dadurch wird es funktionieren:

class Bar(tuple): 
    @staticmethod 
    def __new__(cls, initialValue=(0,0)): 
     return tuple.__new__(cls, initialValue) 

Der wesentliche Grund dafür ist, dass, da Tupel unveränderlich ist, müssen sie mit ihren Daten im Voraus gebaut werden, noch bevor Sie sie auf der Python-Ebene sehen. Wenn die Daten über __init__ geliefert würden, hätten Sie grundsätzlich ein leeres Tupel am Anfang Ihrer eigenen __init__, das sich dann änderte, als Sie super().__init__() anriefen.

+0

[Hier ist eine weitere detaillierte Erklärung] (http://stackoverflow.com/a/1565448/1460057). – Brionius

+0

passiert es auch mit Arrays? – levi

+1

@levi: Nicht, wenn du mit "array" die Listen symbolisierst. Sie nehmen ihre Argumente durch "__init__". – Dolda2000

Verwandte Themen