diff --git a/NEWS b/NEWS
index 90897a2..f3f0086 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,9 @@
+Library
+-------
+
+- Issue #21750: mock_open.read_data can now be read from each instance, as it
+  could in Python 3.3.
+
 - Issue #18622: unittest.mock.mock_open().reset_mock would recurse infinitely.
   Patch from Nicola Palumbo and Laurent De Buyst.
 
diff --git a/mock/mock.py b/mock/mock.py
index a4b9e29..dc01947 100644
--- a/mock/mock.py
+++ b/mock/mock.py
@@ -2468,18 +2468,18 @@
     def _readlines_side_effect(*args, **kwargs):
         if handle.readlines.return_value is not None:
             return handle.readlines.return_value
-        return list(_data)
+        return list(_state[0])
 
     def _read_side_effect(*args, **kwargs):
         if handle.read.return_value is not None:
             return handle.read.return_value
-        return ''.join(_data)
+        return ''.join(_state[0])
 
     def _readline_side_effect():
         if handle.readline.return_value is not None:
             while True:
                 yield handle.readline.return_value
-        for line in _data:
+        for line in _state[0]:
             yield line
 
 
@@ -2498,7 +2498,7 @@
     handle = MagicMock(spec=file_spec)
     handle.__enter__.return_value = handle
 
-    _data = _iterate_read_data(read_data)
+    _state = [_iterate_read_data(read_data), None]
 
     handle.write.return_value = None
     handle.read.return_value = None
@@ -2506,9 +2506,19 @@
     handle.readlines.return_value = None
 
     handle.read.side_effect = _read_side_effect
-    handle.readline.side_effect = _readline_side_effect()
+    _state[1] = _readline_side_effect()
+    handle.readline.side_effect = _state[1]
     handle.readlines.side_effect = _readlines_side_effect
 
+    def reset_data(*args, **kwargs):
+        _state[0] = _iterate_read_data(read_data)
+        if handle.readline.side_effect == _state[1]:
+            # Only reset the side effect if the user hasn't overridden it.
+            _state[1] = _readline_side_effect()
+            handle.readline.side_effect = _state[1]
+        return DEFAULT
+
+    mock.side_effect = reset_data
     mock.return_value = handle
     return mock
 
diff --git a/mock/tests/testmock.py b/mock/tests/testmock.py
index 4be8779..d956064 100644
--- a/mock/tests/testmock.py
+++ b/mock/tests/testmock.py
@@ -10,6 +10,7 @@
 import copy
 import pickle
 import sys
+import tempfile
 
 import mock
 from mock import (
@@ -1436,7 +1437,33 @@
             self.assertEqual(m.mock_calls, [call.__int__(), call.__float__()])
             self.assertEqual(m.method_calls, [])
 
+    def test_mock_open_reuse_issue_21750(self):
+        mocked_open = mock.mock_open(read_data='data')
+        f1 = mocked_open('a-name')
+        f1_data = f1.read()
+        f2 = mocked_open('another-name')
+        f2_data = f2.read()
+        self.assertEqual(f1_data, f2_data)
 
+    def test_mock_open_write(self):
+        # Test exception in file writing write()
+        mock_namedtemp = mock.mock_open(mock.MagicMock(name='JLV'))
+        with mock.patch('tempfile.NamedTemporaryFile', mock_namedtemp):
+            mock_filehandle = mock_namedtemp.return_value
+            mock_write = mock_filehandle.write
+            mock_write.side_effect = OSError('Test 2 Error')
+            def attempt():
+                tempfile.NamedTemporaryFile().write('asd')
+            self.assertRaises(OSError, attempt)
+
+    def test_mock_open_alter_readline(self):
+        mopen = mock.mock_open(read_data='foo\nbarn')
+        mopen.return_value.readline.side_effect = lambda *args:'abc'
+        first = mopen().readline()
+        second = mopen().readline()
+        self.assertEqual('abc', first)
+        self.assertEqual('abc', second)
+ 
     def test_mock_parents(self):
         for Klass in Mock, MagicMock:
             m = Klass()
diff --git a/mock/tests/testwith.py b/mock/tests/testwith.py
index 25d706f..b9cfab1 100644
--- a/mock/tests/testwith.py
+++ b/mock/tests/testwith.py
@@ -156,6 +156,20 @@
         self.assertEqual(mock.mock_calls, expected_calls)
         self.assertIs(f, handle)
 
+    def test_mock_open_context_manager_multiple_times(self):
+        mock = mock_open()
+        with patch('%s.open' % __name__, mock, create=True):
+            with open('foo') as f:
+                f.read()
+            with open('bar') as f:
+                f.read()
+
+        expected_calls = [
+            call('foo'), call().__enter__(), call().read(),
+            call().__exit__(None, None, None),
+            call('bar'), call().__enter__(), call().read(),
+            call().__exit__(None, None, None)]
+        self.assertEqual(mock.mock_calls, expected_calls)
 
     def test_explicit_mock(self):
         mock = MagicMock()
