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

Gerald Britton gerald.britton at gmail.com
Sat Oct 22 11:06:21 EDT 2016


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.  However, the
example runs fine. That is the class D can be instantiated without error.
Of course I cannot set the property since I didn't implement that part.

Now, If I don't implement the property at all, I can' instantiate the
class.  I get:

"TypeError: Can't instantiate abstract class D with abstract methods x"

which is what I would expect.  What I don't understand is why I don't get a
similar error when I implement the read operation for the property but not
the write operation.

If this actually doesn't work (catching the non-implementation at
instantiation time), then why is it documented this way.  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?)

Is this a doc bug, an  ABC bug or just me? (I've been known to be buggy
from time to time!)

-- 
Gerald Britton



More information about the Python-list mailing list