Sembra this o this sono discussioni in qualche modo correlati, ma le cose ancora non ho capito :)Impossibile impostare l'attributo di sottoclassi di namedtuple
che sto cercando di creare una sottoclasse di namedtuple
e fornire diversi inizializzatori in modo che io possa costruire oggetti in modi diversi. Ad esempio:
>>> 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
Tuttavia, questo non funziona:
>>> 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
Dopo qualche rovistando (per esempio, vedere this filo) Ho cercato di utilizzare costruttori anziché initializers:
>>> 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)
che sembrava costruire un oggetto ma poi non riesco a leggere i suoi attributi:
>>> 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'
Dove sto andando storto qui? Come posso creare una sottoclasse con più costruttori o inizializzatori?
Perché hai i metodi doppio '__init__' e' __new__'? Solo il secondo conta, sovrascrive il primo. Python non esegue il "overload" delle firme dei metodi. –
Nessun sovraccarico ... Questo significa che il mio obiettivo originale di creare istanze di C in modi diversi (a seconda dei costruttori sovraccaricati) non è effettivamente fattibile? – Jens
È perfettamente fattibile, usando solo paradigmi diversi. –