@@ -122,10 +122,6 @@ def _default_kernel_buffers(self):
122122 last_kernel_activity = Instance (datetime ,
123123 help = "The last activity on any kernel, including shutting down a kernel" )
124124
125- def __init__ (self , ** kwargs ):
126- super ().__init__ (** kwargs )
127- self .last_kernel_activity = utcnow ()
128-
129125 allowed_message_types = List (trait = Unicode (), config = True ,
130126 help = """White list of allowed kernel message types.
131127 When the list is empty, all message types are allowed.
@@ -137,8 +133,11 @@ def __init__(self, **kwargs):
137133 #-------------------------------------------------------------------------
138134
139135 def __init__ (self , ** kwargs ):
140- self .super = MultiKernelManager
141- self .super .__init__ (self , ** kwargs )
136+ # Pin the superclass to better control the MRO. This is needed by
137+ # AsyncMappingKernelManager so that it can give priority to methods
138+ # on AsyncMultiKernelManager over this superclass.
139+ self .pinned_superclass = MultiKernelManager
140+ self .pinned_superclass .__init__ (self , ** kwargs )
142141 self .last_kernel_activity = utcnow ()
143142
144143 def _handle_kernel_died (self , kernel_id ):
@@ -173,7 +172,7 @@ async def start_kernel(self, kernel_id=None, path=None, **kwargs):
173172 if kernel_id is None :
174173 if path is not None :
175174 kwargs ['cwd' ] = self .cwd_for_path (path )
176- kernel_id = await maybe_future (self .super .start_kernel (self , ** kwargs ))
175+ kernel_id = await maybe_future (self .pinned_superclass .start_kernel (self , ** kwargs ))
177176 self ._kernel_connections [kernel_id ] = 0
178177 self .start_watching_activity (kernel_id )
179178 self .log .info ("Kernel started: %s" % kernel_id )
@@ -302,12 +301,12 @@ def shutdown_kernel(self, kernel_id, now=False, restart=False):
302301 type = self ._kernels [kernel_id ].kernel_name
303302 ).dec ()
304303
305- return self .super .shutdown_kernel (self , kernel_id , now = now , restart = restart )
304+ return self .pinned_superclass .shutdown_kernel (self , kernel_id , now = now , restart = restart )
306305
307306 async def restart_kernel (self , kernel_id , now = False ):
308307 """Restart a kernel by kernel_id"""
309308 self ._check_kernel_id (kernel_id )
310- await maybe_future (self .super .restart_kernel (self , kernel_id , now = now ))
309+ await maybe_future (self .pinned_superclass .restart_kernel (self , kernel_id , now = now ))
311310 kernel = self .get_kernel (kernel_id )
312311 # return a Future that will resolve when the kernel has successfully restarted
313312 channel = kernel .connect_shell ()
@@ -374,7 +373,7 @@ def kernel_model(self, kernel_id):
374373 def list_kernels (self ):
375374 """Returns a list of kernel_id's of kernels running."""
376375 kernels = []
377- kernel_ids = self .super .list_kernel_ids (self )
376+ kernel_ids = self .pinned_superclass .list_kernel_ids (self )
378377 for kernel_id in kernel_ids :
379378 model = self .kernel_model (kernel_id )
380379 kernels .append (model )
@@ -485,8 +484,9 @@ def _default_kernel_manager_class(self):
485484 return "jupyter_client.ioloop.AsyncIOLoopKernelManager"
486485
487486 def __init__ (self , ** kwargs ):
488- self .super = AsyncMultiKernelManager
489- self .super .__init__ (self , ** kwargs )
487+ # Pin the superclass to better control the MRO.
488+ self .pinned_superclass = AsyncMultiKernelManager
489+ self .pinned_superclass .__init__ (self , ** kwargs )
490490 self .last_kernel_activity = utcnow ()
491491
492492 async def shutdown_kernel (self , kernel_id , now = False , restart = False ):
@@ -505,4 +505,4 @@ async def shutdown_kernel(self, kernel_id, now=False, restart=False):
505505 type = self ._kernels [kernel_id ].kernel_name
506506 ).dec ()
507507
508- return await self .super .shutdown_kernel (self , kernel_id , now = now , restart = restart )
508+ return await self .pinned_superclass .shutdown_kernel (self , kernel_id , now = now , restart = restart )
0 commit comments