Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 70d2b89

Browse files
committed
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).
1 parent 46334cd commit 70d2b89

2 files changed

Lines changed: 36 additions & 18 deletions

File tree

Lib/abc.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ class abstractproperty(property):
3030
Requires that the metaclass is ABCMeta or derived from it. A
3131
class that has a metaclass derived from ABCMeta cannot be
3232
instantiated unless all of its abstract properties are overridden.
33+
The abstract properties can be called using any of the the normal
34+
'super' call mechanisms.
3335
3436
Usage:
3537

Lib/test/test_abc.py

Lines changed: 34 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -19,26 +19,42 @@ def foo(self): pass
1919
def bar(self): pass
2020
self.assertEqual(hasattr(bar, "__isabstractmethod__"), False)
2121

22-
def test_abstractmethod_integration(self):
22+
def test_abstractproperty_basics(self):
23+
@abc.abstractproperty
24+
def foo(self): pass
25+
self.assertEqual(foo.__isabstractmethod__, True)
26+
def bar(self): pass
27+
self.assertEqual(hasattr(bar, "__isabstractmethod__"), False)
28+
2329
class C(metaclass=abc.ABCMeta):
24-
@abc.abstractmethod
25-
def foo(self): pass # abstract
26-
def bar(self): pass # concrete
27-
self.assertEqual(C.__abstractmethods__, {"foo"})
28-
self.assertRaises(TypeError, C) # because foo is abstract
30+
@abc.abstractproperty
31+
def foo(self): return 3
2932
class D(C):
30-
def bar(self): pass # concrete override of concrete
31-
self.assertEqual(D.__abstractmethods__, {"foo"})
32-
self.assertRaises(TypeError, D) # because foo is still abstract
33-
class E(D):
34-
def foo(self): pass
35-
self.assertEqual(E.__abstractmethods__, set())
36-
E() # now foo is concrete, too
37-
class F(E):
38-
@abc.abstractmethod
39-
def bar(self): pass # abstract override of concrete
40-
self.assertEqual(F.__abstractmethods__, {"bar"})
41-
self.assertRaises(TypeError, F) # because bar is abstract now
33+
@property
34+
def foo(self): return super().foo
35+
self.assertEqual(D().foo, 3)
36+
37+
def test_abstractmethod_integration(self):
38+
for abstractthing in [abc.abstractmethod, abc.abstractproperty]:
39+
class C(metaclass=abc.ABCMeta):
40+
@abstractthing
41+
def foo(self): pass # abstract
42+
def bar(self): pass # concrete
43+
self.assertEqual(C.__abstractmethods__, {"foo"})
44+
self.assertRaises(TypeError, C) # because foo is abstract
45+
class D(C):
46+
def bar(self): pass # concrete override of concrete
47+
self.assertEqual(D.__abstractmethods__, {"foo"})
48+
self.assertRaises(TypeError, D) # because foo is still abstract
49+
class E(D):
50+
def foo(self): pass
51+
self.assertEqual(E.__abstractmethods__, set())
52+
E() # now foo is concrete, too
53+
class F(E):
54+
@abstractthing
55+
def bar(self): pass # abstract override of concrete
56+
self.assertEqual(F.__abstractmethods__, {"bar"})
57+
self.assertRaises(TypeError, F) # because bar is abstract now
4258

4359
def test_registration_basics(self):
4460
class A(metaclass=abc.ABCMeta):

0 commit comments

Comments
 (0)