@@ -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