Skip to content

Commit fd1c245

Browse files
committed
Fix issue 1747: allow classic classes to be checked for being subclasses of
ABCs.
1 parent 1db6f80 commit fd1c245

2 files changed

Lines changed: 12 additions & 5 deletions

File tree

Lib/abc.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ def __subclasscheck__(cls, subclass):
188188
cls._abc_negative_cache.add(subclass)
189189
return ok
190190
# Check if it's a direct subclass
191-
if cls in subclass.__mro__:
191+
if cls in getattr(subclass, '__mro__', ()):
192192
cls._abc_cache.add(subclass)
193193
return True
194194
# Check if it's a subclass of a registered class (recursive)

Lib/test/test_abc.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
from test import test_support
99

1010
import abc
11-
__metaclass__ = type
1211

1312

1413
class TestABC(unittest.TestCase):
@@ -59,10 +58,18 @@ def bar(self): pass # abstract override of concrete
5958
self.assertEqual(F.__abstractmethods__, set(["bar"]))
6059
self.assertRaises(TypeError, F) # because bar is abstract now
6160

61+
def test_subclass_oldstyle_class(self):
62+
class A:
63+
__metaclass__ = abc.ABCMeta
64+
class OldstyleClass:
65+
pass
66+
self.assertFalse(issubclass(OldstyleClass, A))
67+
self.assertFalse(issubclass(A, OldstyleClass))
68+
6269
def test_registration_basics(self):
6370
class A:
6471
__metaclass__ = abc.ABCMeta
65-
class B:
72+
class B(object):
6673
pass
6774
b = B()
6875
self.assertEqual(issubclass(B, A), False)
@@ -95,7 +102,7 @@ class A:
95102
class A1(A):
96103
pass
97104
self.assertRaises(RuntimeError, A1.register, A) # cycles not allowed
98-
class B:
105+
class B(object):
99106
pass
100107
A1.register(B) # ok
101108
A1.register(B) # should pass silently
@@ -136,7 +143,7 @@ class MyInt(int):
136143
def test_all_new_methods_are_called(self):
137144
class A:
138145
__metaclass__ = abc.ABCMeta
139-
class B:
146+
class B(object):
140147
counter = 0
141148
def __new__(cls):
142149
B.counter += 1

0 commit comments

Comments
 (0)