[Python] attributi astratti?

enrico franchi enrico.franchi a gmail.com
Mar 15 Mar 2016 19:29:18 CET


2016-03-15 17:15 GMT+00:00 Marco Santamaria <marco.santamaria a gmail.com>:


> In realtà da Python 3.3 è deprecato in favore dell'uso combinato di
> @property e @abstractmethod.
>

Vero. Comunque il concetto e' quello.


> Il guaio di questo approccio è che le classi derivate devono implementare
> un metodo decorato con @property e non basta definire una proprietà
> (giustamente non attributo, che è più generale) come con @abstractmethod
>

Esatto. Solo che non e' banale fare veramente un "abstractattribute".



> Poi mi è venuta in mente anche una quarta possibilità: chiamare hasattr
> nel metodo __new__ della classe astratta, cosa che segnala l'eccezione un
> po' prima che se chiamato in __init__
>

Farlo in __new__ e' marginalmente meglio che farlo in __init__ per vari
motivi (non tanto il fatto che sia segnalata "un po' prima" -- dal punto di
vista dell'utente l'eccezione "esce" nello stesso punto). E non e'
esattamente chiaro se sia meglio controllare con hasattr (o equivalente)
sull'oggetto oppure guardare i parametri di input.

Quello che vorrei fosse chiaro e' che in questo universo il tuo problema e'
che dipendi in modo marcato da cose fuori dal tuo controllo. Cioe', il
motivo per cui ti stai sbattendo per questo "abstract attribute" e' che
vuoi di fatto dare sta libreria in mano a terze parti (potenzialmente anche
interni) e vuoi evitare che il contratto del tuo codice non sia mantenuto
(e se non lo e', segnalarlo in modo opportuno).

Solo che Python ti consente di fare tantissime cose (anche molto sensate) e
che il *come* le fai puo' vuole dire che il tuo controllo funziona o
meglio. Per dire... cosa succede se uno ha delle namedtuples nella
gerarchia da qualche parte? Mica banale...



-- 
.
..: -enrico-
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20160315/38470c1e/attachment-0001.html>


Maggiori informazioni sulla lista Python