Well what do you know.  The Python implementation contained the same
bug as the C code. :-(
diff --git a/Objects/descrobject.c b/Objects/descrobject.c
index 4022e89..54c0347 100644
--- a/Objects/descrobject.c
+++ b/Objects/descrobject.c
@@ -911,10 +911,10 @@
             self.__doc__ = doc
 
         def __get__(self, inst, type=None):
-            if self.__get is None:
-                raise AttributeError, "unreadable attribute"
             if inst is None:
                 return self
+            if self.__get is None:
+                raise AttributeError, "unreadable attribute"
             return self.__get(inst)
 
         def __set__(self, inst, value):