Question about abstract base classes and abstract properties -- Python 2.7

Steven D'Aprano steve+comp.lang.python at
Tue Jan 10 21:16:43 EST 2017

On Wednesday 11 January 2017 12:26, Gerald Britton wrote:

> I was rereading the 2.7 docs  about abstract base classes the other day.  I
> found this line in the usage section of the abc.abstractproperty function:
> "This defines a read-only property; you can also define a read-write
> abstract property using the ‘long’ form of property declaration:"
> along with an example.  so I copied the example and put in a little
> surrounding code:
> from abc import ABCMeta, abstractproperty
> class C(object):
>     __metaclass__ = ABCMeta
>     def getx(self): pass
>     def setx(self, value): pass
>     x = abstractproperty(getx, setx)
> class D(C):
>     @property
>     def x(self):self._x
> d = D()
> print(d)
> When I ran this, I expected an exception, since I defined a read/write
> abstract property but only implemented the read operation.

I expected the same thing.

> If this actually doesn't work (catching the non-implementation at
> instantiation time), then would it be appropriate to amend the
> documentation?  To me at least the doc implies that it *will* raise on the
> missing write property implementation (otherwise, what's the point of the
> example?)

Personally, I consider this a design bug: as designed, abstractproperty is 
broken. But I couldn't call it a functional bug: it looks like it is working as 
documented, as useless as that it.

Note that in Python 3.3 and better, abstractproperty is deprecated: the ABC 
metaclass is smart enough to work with the regular property decorator:

> Or, am I just not grokking it properly?

No, I agree with you. I think that a bug request to improve the documentation 
is appropriate.

"Ever since I learned about confirmation bias, I've been seeing 
it everywhere." - Jon Ronson

More information about the Python-list mailing list