[Python] attributi astratti?

Marco Santamaria marco.santamaria a gmail.com
Mar 15 Mar 2016 18:15:55 CET


Il giorno 15 marzo 2016 17:38, enrico franchi <enrico.franchi a gmail.com> ha
scritto
>
> O a me non e' chiaro quale sia il tuo problema concreto, oppure tu non hai
> guardato la doc per abstractproperty.
>
> https://docs.python.org/2/library/abc.html#abc.abstractproperty
>

In effetti lo avevo visto, e mi era sembrato un po' più appropriato che
richiedere un metodo come con @abstractmethod. In realtà da Python 3.3 è
deprecato in favore dell'uso combinato di @property e @abstractmethod. 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:

In [1]: from abc import ABC, abstractmethod
>
> In [2]: class B(ABC):
>    ...:     @property
>    ...:     @abstractmethod
>    ...:     def foo(self): pass
>    ...:
>
> In [3]: class A(B):
>    ...:     foo = 'bar'
>    ...:
>
> In [4]: A()
> Out[4]: <__main__.A at 0x7f2940d14160>
>
> In [5]: A().bar
> ---------------------------------------------------------------------------
> AttributeError                            Traceback (most recent call last)
> <ipython-input-5-41873e071d53> in <module>()
> ----> 1 A().bar
>
> AttributeError: 'A' object has no attribute 'bar'
>
> In [6]: class C(ABC):
>    ...:     @abstractmethod
>    ...:     def foo(self): pass
>    ...:
>
> In [7]: class D(C):
>    ...:     foo = 'bar'
>    ...:
>
> In [8]: D()
> Out[8]: <__main__.D at 0x7f2940d320f0>
>
> In [9]: D.foo
> Out[9]: 'bar'
>

Comunque abstractproperty (o equivalentemente property + abstractmethod) si
avvicina di più a quello che cercavo.

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__

Grazie,
Marco

-- 
|_|0|_|
|_|_|0|
|0|0|0|
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20160315/5854422c/attachment.html>


Maggiori informazioni sulla lista Python