Kann nicht festgelegt werden, das Attribut für die Unterklassen der namedtuple

Sieht es aus wie diese oder diese etwas Verwandte threads, aber immer noch nicht kapiert Dinge aus 🙂

Ich versuche, erstellen Sie eine Unterklasse von namedtuple und bieten verschiedene Initialisierungen, so dass ich konstruieren von Objekten auf unterschiedliche Weise. Zum Beispiel:

>>> from collections import namedtuple
>>> class C(namedtuple("C", "x, y")) :
...     __slots__ = ()
...     def __init__(self, obj) : # Initialize a C instance by copying values from obj
...         self.x = obj.a
...         self.y = obj.b
...     def __init__(self, x, y) : # Initialize a C instance from the parameters
...         self.x = x
...         self.y = y

Jedoch, dass nicht funktioniert:

>>> c = C(1, 2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 7, in __init__
AttributeError: can't set attribute

Nach einigen stochern (siehe beispielsweise diese thread) habe ich versucht zu verwenden Konstruktoren statt Initialisierungen:

>>> from collections import namedtuple
>>> class C(namedtuple("C", "x, y")) :
...     __slots__ = ()
...     def __new__(cls, obj) :
...       self = super(C, cls).__new__(cls, obj.a, obj.b)
...     def __new__(cls, x, y) :
...       self = super(C, cls).__new__(cls, x, y)

schien zu konstruieren ein Objekt, aber dann kann ich nicht Lesen der Attribute:

>>> c = C(1,2)
>>> c.x, c.y
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'x'

Wo bin ich denn hier falsch? Wie kann ich erstellen Sie eine Unterklasse mit mehreren Konstruktoren oder Initialisierungen?

Warum haben Sie Doppelzimmer __init__ und __new__ Methoden? Nur die Sekunde zählt, überschreibt er den ersten. Python macht nicht 'überladen' Methoden Signaturen.
Keine überlastung... das bedeutet Also, dass mein ursprüngliches Ziel der Schaffung von Instanzen von C auf verschiedenen wegen (je nach überladenen Konstruktoren) ist eigentlich nicht machbar?
Es ist vollkommen machbar, nur mit unterschiedlichen Paradigmen.
Siehe mein Kommentar weiter unten, unter deiner Antwort. Sie sagen, es ist machbar mit factory-Methoden, aber nicht mit mehreren "Konstruktoren"?
Sie können die Verwendung von nur einem Konstruktor, aber der Konstruktor kann variieren Verhalten auf der Grundlage der Argumente, die Sie übergeben.

InformationsquelleAutor Jens | 2013-10-08

Schreibe einen Kommentar