Close #14857: fix regression in references to PEP 3135 implicit __class__ closure variable. Reopens issue #12370, but also updates unittest.mock to workaround that issue
diff --git a/Lib/test/test_super.py b/Lib/test/test_super.py
index 298cae0..32eb1c0 100644
--- a/Lib/test/test_super.py
+++ b/Lib/test/test_super.py
@@ -81,6 +81,7 @@
 
         self.assertEqual(E().f(), 'AE')
 
+    @unittest.expectedFailure
     def test___class___set(self):
         # See issue #12370
         class X(A):
@@ -91,6 +92,29 @@
         self.assertEqual(x.f(), 'A')
         self.assertEqual(x.__class__, 413)
 
+    def test___class___instancemethod(self):
+        # See issue #14857
+        class X:
+            def f(self):
+                return __class__
+        self.assertIs(X().f(), X)
+
+    def test___class___classmethod(self):
+        # See issue #14857
+        class X:
+            @classmethod
+            def f(cls):
+                return __class__
+        self.assertIs(X.f(), X)
+
+    def test___class___staticmethod(self):
+        # See issue #14857
+        class X:
+            @staticmethod
+            def f():
+                return __class__
+        self.assertIs(X.f(), X)
+
 
 def test_main():
     support.run_unittest(TestSuper)
diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py
index a94acd6..36be0fd 100644
--- a/Lib/unittest/mock.py
+++ b/Lib/unittest/mock.py
@@ -39,6 +39,9 @@
 
 FILTER_DIR = True
 
+# Workaround for issue #12370
+# Without this, the __class__ properties wouldn't be set correctly
+_safe_super = super
 
 def _is_instance_mock(obj):
     # can't use isinstance on Mock objects because they override __class__
@@ -397,7 +400,7 @@
         if kwargs:
             self.configure_mock(**kwargs)
 
-        super(NonCallableMock, self).__init__(
+        _safe_super(NonCallableMock, self).__init__(
             spec, wraps, name, spec_set, parent,
             _spec_state
         )
@@ -820,7 +823,7 @@
                  _spec_state=None, _new_name='', _new_parent=None, **kwargs):
         self.__dict__['_mock_return_value'] = return_value
 
-        super(CallableMixin, self).__init__(
+        _safe_super(CallableMixin, self).__init__(
             spec, wraps, name, spec_set, parent,
             _spec_state, _new_name, _new_parent, **kwargs
         )
@@ -1690,7 +1693,7 @@
 
 class MagicMixin(object):
     def __init__(self, *args, **kw):
-        super(MagicMixin, self).__init__(*args, **kw)
+        _safe_super(MagicMixin, self).__init__(*args, **kw)
         self._mock_set_magics()