fork download
  1. import sys
  2. import builtins
  3. from types import resolve_bases, _calculate_meta
  4.  
  5. class class_super(super):
  6. def __init__(self):
  7. cls = type('_TempClass', tuple(sys._getframe(1).f_locals['__mro__']), {})
  8. super().__init__(cls, cls)
  9.  
  10. class NewType(type):
  11. def mro(cls_or_bases):
  12. if isinstance(cls_or_bases, type):
  13. return super().mro()
  14. return __class__('_TempClass', cls_or_bases, {}).mro()
  15.  
  16. def build_class(func, name, *bases, metaclass=NewType, **kwargs):
  17. metaclass = _calculate_meta(metaclass, bases)
  18. namespace = metaclass.__prepare__(name, bases, **kwargs)
  19. resolved_bases = resolve_bases(bases)
  20. namespace['__mro__'] = metaclass.mro(resolved_bases)
  21. exec(func.__code__, globals(), namespace)
  22. if resolved_bases != bases:
  23. namespace['__orig_bases__'] = bases
  24. del namespace['__mro__']
  25. return metaclass(name, resolved_bases, namespace)
  26.  
  27. builtins.__build_class__ = build_class
  28.  
  29. class Base:
  30. __slots__ = 'foo',
  31.  
  32. def __init__(self, foo):
  33. self.foo = foo
  34.  
  35. class Child(Base):
  36. __slots__ = class_super().__slots__ + ('bar',)
  37.  
  38. def __init__(self, foo, bar):
  39. super().__init__(foo)
  40. self.bar = bar
  41.  
  42. print(Child.__slots__)
  43. child = Child(1, 2)
  44. print(child.foo)
  45. print(child.bar)
Success #stdin #stdout 0.03s 9676KB
stdin
Standard input is empty
stdout
('foo', 'bar')
1
2