import sys
import builtins
from types import resolve_bases, _calculate_meta
class class_super(super):
def __init__(self):
cls = type('_TempClass', tuple(sys._getframe(1).f_locals['__mro__']), {})
super().__init__(cls, cls)
class NewType(type):
def mro(cls_or_bases):
if isinstance(cls_or_bases, type):
return super().mro()
return __class__('_TempClass', cls_or_bases, {}).mro()
def build_class(func, name, *bases, metaclass=NewType, **kwargs):
metaclass = _calculate_meta(metaclass, bases)
namespace = metaclass.__prepare__(name, bases, **kwargs)
resolved_bases = resolve_bases(bases)
namespace['__mro__'] = metaclass.mro(resolved_bases)
exec(func.__code__, globals(), namespace)
if resolved_bases != bases:
namespace['__orig_bases__'] = bases
del namespace['__mro__']
return metaclass(name, resolved_bases, namespace)
builtins.__build_class__ = build_class
class Base:
__slots__ = 'foo',
def __init__(self, foo):
self.foo = foo
class Child(Base):
__slots__ = class_super().__slots__ + ('bar',)
def __init__(self, foo, bar):
super().__init__(foo)
self.bar = bar
print(Child.__slots__)
child = Child(1, 2)
print(child.foo)
print(child.bar)
aW1wb3J0IHN5cwppbXBvcnQgYnVpbHRpbnMKZnJvbSB0eXBlcyBpbXBvcnQgcmVzb2x2ZV9iYXNlcywgX2NhbGN1bGF0ZV9tZXRhCgpjbGFzcyBjbGFzc19zdXBlcihzdXBlcik6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgY2xzID0gdHlwZSgnX1RlbXBDbGFzcycsIHR1cGxlKHN5cy5fZ2V0ZnJhbWUoMSkuZl9sb2NhbHNbJ19fbXJvX18nXSksIHt9KQogICAgICAgIHN1cGVyKCkuX19pbml0X18oY2xzLCBjbHMpCgpjbGFzcyBOZXdUeXBlKHR5cGUpOgogICAgZGVmIG1ybyhjbHNfb3JfYmFzZXMpOgogICAgICAgIGlmIGlzaW5zdGFuY2UoY2xzX29yX2Jhc2VzLCB0eXBlKToKICAgICAgICAgICAgcmV0dXJuIHN1cGVyKCkubXJvKCkKICAgICAgICByZXR1cm4gX19jbGFzc19fKCdfVGVtcENsYXNzJywgY2xzX29yX2Jhc2VzLCB7fSkubXJvKCkKCmRlZiBidWlsZF9jbGFzcyhmdW5jLCBuYW1lLCAqYmFzZXMsIG1ldGFjbGFzcz1OZXdUeXBlLCAqKmt3YXJncyk6CiAgICBtZXRhY2xhc3MgPSBfY2FsY3VsYXRlX21ldGEobWV0YWNsYXNzLCBiYXNlcykKICAgIG5hbWVzcGFjZSA9IG1ldGFjbGFzcy5fX3ByZXBhcmVfXyhuYW1lLCBiYXNlcywgKiprd2FyZ3MpCiAgICByZXNvbHZlZF9iYXNlcyA9IHJlc29sdmVfYmFzZXMoYmFzZXMpCiAgICBuYW1lc3BhY2VbJ19fbXJvX18nXSA9IG1ldGFjbGFzcy5tcm8ocmVzb2x2ZWRfYmFzZXMpCiAgICBleGVjKGZ1bmMuX19jb2RlX18sIGdsb2JhbHMoKSwgbmFtZXNwYWNlKQogICAgaWYgcmVzb2x2ZWRfYmFzZXMgIT0gYmFzZXM6CiAgICAgICAgbmFtZXNwYWNlWydfX29yaWdfYmFzZXNfXyddID0gYmFzZXMKICAgIGRlbCBuYW1lc3BhY2VbJ19fbXJvX18nXQogICAgcmV0dXJuIG1ldGFjbGFzcyhuYW1lLCByZXNvbHZlZF9iYXNlcywgbmFtZXNwYWNlKQoKYnVpbHRpbnMuX19idWlsZF9jbGFzc19fID0gYnVpbGRfY2xhc3MKCmNsYXNzIEJhc2U6CiAgICBfX3Nsb3RzX18gPSAnZm9vJywKCiAgICBkZWYgX19pbml0X18oc2VsZiwgZm9vKToKICAgICAgICBzZWxmLmZvbyA9IGZvbwoKY2xhc3MgQ2hpbGQoQmFzZSk6CiAgICBfX3Nsb3RzX18gPSBjbGFzc19zdXBlcigpLl9fc2xvdHNfXyArICgnYmFyJywpCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGZvbywgYmFyKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKGZvbykKICAgICAgICBzZWxmLmJhciA9IGJhcgoKcHJpbnQoQ2hpbGQuX19zbG90c19fKQpjaGlsZCA9IENoaWxkKDEsIDIpCnByaW50KGNoaWxkLmZvbykKcHJpbnQoY2hpbGQuYmFyKQ==