[Python-3000-checkins] r56650 - in python/branches/py3k-struni/Lib: abc.py test/test_abc.py

guido.van.rossum python-3000-checkins at python.org
Wed Aug 1 19:52:24 CEST 2007


Author: guido.van.rossum
Date: Wed Aug  1 19:52:23 2007
New Revision: 56650

Modified:
   python/branches/py3k-struni/Lib/abc.py
   python/branches/py3k-struni/Lib/test/test_abc.py
Log:
Tests for @abstractproperty by Jeffrey Yasskin.
(The previous changes to abc.py were also by him).
Put back a comment about using super() for properties
(I didn't realize this worked).


Modified: python/branches/py3k-struni/Lib/abc.py
==============================================================================
--- python/branches/py3k-struni/Lib/abc.py	(original)
+++ python/branches/py3k-struni/Lib/abc.py	Wed Aug  1 19:52:23 2007
@@ -30,6 +30,8 @@
     Requires that the metaclass is ABCMeta or derived from it.  A
     class that has a metaclass derived from ABCMeta cannot be
     instantiated unless all of its abstract properties are overridden.
+    The abstract properties can be called using any of the the normal
+    'super' call mechanisms.
 
     Usage:
 

Modified: python/branches/py3k-struni/Lib/test/test_abc.py
==============================================================================
--- python/branches/py3k-struni/Lib/test/test_abc.py	(original)
+++ python/branches/py3k-struni/Lib/test/test_abc.py	Wed Aug  1 19:52:23 2007
@@ -19,26 +19,42 @@
         def bar(self): pass
         self.assertEqual(hasattr(bar, "__isabstractmethod__"), False)
 
-    def test_abstractmethod_integration(self):
+    def test_abstractproperty_basics(self):
+        @abc.abstractproperty
+        def foo(self): pass
+        self.assertEqual(foo.__isabstractmethod__, True)
+        def bar(self): pass
+        self.assertEqual(hasattr(bar, "__isabstractmethod__"), False)
+
         class C(metaclass=abc.ABCMeta):
-            @abc.abstractmethod
-            def foo(self): pass  # abstract
-            def bar(self): pass  # concrete
-        self.assertEqual(C.__abstractmethods__, {"foo"})
-        self.assertRaises(TypeError, C)  # because foo is abstract
+            @abc.abstractproperty
+            def foo(self): return 3
         class D(C):
-            def bar(self): pass  # concrete override of concrete
-        self.assertEqual(D.__abstractmethods__, {"foo"})
-        self.assertRaises(TypeError, D)  # because foo is still abstract
-        class E(D):
-            def foo(self): pass
-        self.assertEqual(E.__abstractmethods__, set())
-        E()  # now foo is concrete, too
-        class F(E):
-            @abc.abstractmethod
-            def bar(self): pass  # abstract override of concrete
-        self.assertEqual(F.__abstractmethods__, {"bar"})
-        self.assertRaises(TypeError, F)  # because bar is abstract now
+            @property
+            def foo(self): return super().foo
+        self.assertEqual(D().foo, 3)
+
+    def test_abstractmethod_integration(self):
+        for abstractthing in [abc.abstractmethod, abc.abstractproperty]:
+            class C(metaclass=abc.ABCMeta):
+                @abstractthing
+                def foo(self): pass  # abstract
+                def bar(self): pass  # concrete
+            self.assertEqual(C.__abstractmethods__, {"foo"})
+            self.assertRaises(TypeError, C)  # because foo is abstract
+            class D(C):
+                def bar(self): pass  # concrete override of concrete
+            self.assertEqual(D.__abstractmethods__, {"foo"})
+            self.assertRaises(TypeError, D)  # because foo is still abstract
+            class E(D):
+                def foo(self): pass
+            self.assertEqual(E.__abstractmethods__, set())
+            E()  # now foo is concrete, too
+            class F(E):
+                @abstractthing
+                def bar(self): pass  # abstract override of concrete
+            self.assertEqual(F.__abstractmethods__, {"bar"})
+            self.assertRaises(TypeError, F)  # because bar is abstract now
 
     def test_registration_basics(self):
         class A(metaclass=abc.ABCMeta):


More information about the Python-3000-checkins mailing list