[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