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

Gerald Britton gerald.britton at gmail.com
Tue Jan 10 20:26:38 EST 2017


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't 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 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?)

Or, am I just not grokking it properly?


More information about the Python-list mailing list