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