Question about abstract base classes and abstract properties -- Python 2.7
Gerald Britton
gerald.britton at gmail.com
Sun Sep 4 16:35:35 EDT 2016
I was rereading the 2.7 docs about abstract base classes the other day. I
found this:
"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:
__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.
Is this a doc bug, an ABC bug or just me? (I've been known to be buggy
from time to time!)
--
Gerald Britton, MCSE-DP, MVP
LinkedIn Profile: http://ca.linkedin.com/in/geraldbritton
More information about the Python-list
mailing list