Мне интересно, как реализован новый супер в Python 3.
Этот вопрос родился у меня после того, как я сделал небольшой пример, и у меня возникла странная ошибка. Я использую Pyutilib Component Architecture (PCA), и я сделал свой пользовательский метакласс для создания нового класса:
from pyutilib.component.core import implements, SingletonPlugin, PluginMeta, Interface
class IPass(Interface):
pass
class __MetaPlugin(PluginMeta):
def __new__(cls, name, baseClasses, classdict):
print(cls, name, baseClasses, classdict)
if baseClasses:
baseClasses += (SingletonPlugin,)
return PluginMeta.__new__(cls, name, baseClasses, classdict)
class Pass(metaclass=__MetaPlugin):
implements(IPass)
def __init__(self, inputs=[], outputs=[]):
self.inputs = []
self.outputs = []
class A(Pass):
def __init__(self):
print(self.__class__) # <class '__main__.A'>
print(self.__class__.__class__) # <class '__main__.__MetaPlugin'>
print(PluginMeta.__class__) # <class 'type'>
super().__init__() # SystemError: super(): empty __class__ cell
#Pass.__init__(self) - this works
a = A()
Я получаю следующую ошибку:
super().__init__() SystemError: super(): empty __class__ cell
Я прекрасно понимаю, что именно super(), что он вызывает ошибку на super().__init__()
, тогда как все self.__class__
, self.__class__.__class__
и PluginMeta.__class__
существуют. Дополнительно работает "старый способ" - Pass.__init__(self)
.