Kann nicht eine Instanz eines subclassed namedtuple ausführen

Ich glaube, ich habe nicht unternehmen, wie man eine Klasse definiert, die von einem namedtuple subclassed ist:

from collections import namedtuple PD = namedtuple('PD', 'xy z') p1 = PD(0, 'u', 1) print p1.x #<== this works class PDsub(PD): __slots__ = () def __new__(cls, x, y, z): self = super(PDsub, cls).__new__(cls, x, y, z) return self def __init__(self, a): self.x, self.y, self.z = a, a, a def __str__(self): return 'Foo' p2 = PDsub(5) #<== this does not work 

Dieser Code hebt TypeError : __new__() takes exactly 4 arguments (2 given) .

Irgendwelche Ideen warum?

2 Solutions collect form web for “Kann nicht eine Instanz eines subclassed namedtuple ausführen”

Sowohl der Instanz-Konstruktor ( __new__ ) als auch Ihr Instanz-Initialisierer ( __init__ ) müssen die gleiche Anzahl von Argumenten akzeptieren.

Ihr __new__ braucht 4 Argumente, aber deine __init__ Methode akzeptiert nur 2. Passen Sie die eine oder andere an, um die gleiche Nummer zu akzeptieren, oder verwenden Sie ein *args catch-all-Argument in Ihrer __init__ Methode.

Zum Beispiel würde die Verwendung der folgenden __new__ Methode die Arbeit funktionieren:

 def __new__(cls, a): self = super(PDsub, cls).__new__(cls, a, a, a) return self 

In diesem Fall brauchst du deinen __init__ Initialisierer überhaupt nicht mehr.

Demo:

 >>> from collections import namedtuple >>> PD = namedtuple('PD', 'xy z') >>> class PDsub(PD): ... __slots__ = () ... def __new__(cls, a): ... self = super(PDsub, cls).__new__(cls, a, a, a) ... return self ... def __str__(self): ... return 'Foo' ... >>> p2 = PDsub(5) >>> p2.x, p2.y, p2.z (5, 5, 5) >>> str(p2) 'Foo' 

Ein unveränderlicher Typ wie ein Tupel verwendet oft einen __new__ Konstruktor anstelle eines __init__ Initialisierers; Alle eingebauten unveränderlichen ( frozenset , str , frozenset ) tun dies.

 def __new__(cls, x, y, z): p2 = PDsub(5) 

Wenn Sie ein Objekt für Ihre Klasse erstellen, wird die __new__ Methode (Konstruktor) aufgerufen, um es zu erstellen. Also, hier benötigt deine __new__ Methode 4 Parameter, aber du hast nur 2 überschritten (* Hinweis: – Parameter ist implizit)

Also, entweder ändern Sie Ihre __new__ , um 2 Parameter zu nehmen, oder Sie können Ihre __init__ ändern, um 4 Parameter zu nehmen, und dementsprechend erstellen Sie your instance indem Sie 3 Parameter (1. ist implizit ..)

Python ist die beste Programmiersprache der Welt.