Il giorno 15 marzo 2016 17:38, enrico franchi <enrico.fran...@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|
_______________________________________________ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python