fork download
  1. from ctypes import *
  2. from abc import ABC, abstractmethod, ABCMeta
  3.  
  4.  
  5. class FinalMeta(ABCMeta, type(Structure)):
  6. def __new__(mcs, name, bases, namespace, **kwargs):
  7. print("FinalMeta.__new__(mcs, name, bases, namespace, **kwargs)")
  8. print(" mcs =", mcs)
  9. print(" name =", name)
  10. print(" bases =", bases)
  11. print(" namespace =", namespace)
  12. print(" kwargs =", kwargs)
  13. #Here you should call the type __new__ method
  14. cls = type.__new__(mcs, name, bases, namespace, **kwargs)
  15. print("<-- cls =", cls)
  16. print()
  17. return cls
  18.  
  19.  
  20.  
  21.  
  22. class MessageBase(ABC, Structure, metaclass=FinalMeta):
  23. def __init__(self, *args, **kwargs):
  24. super().__init__()
  25.  
  26. @property
  27. @abstractmethod
  28. def format(self):
  29. pass
  30.  
  31. class ConcreteMessage(MessageBase):
  32. _fields_ = [("x", c_int)]
  33. @property
  34. def format(self):
  35. return "dummy"
  36.  
  37. ConcreteMessage(1)
Runtime error #stdin #stdout #stderr 0.13s 24016KB
stdin
Standard input is empty
stdout
FinalMeta.__new__(mcs, name, bases, namespace, **kwargs)
  mcs = <class '__main__.FinalMeta'>
  name = MessageBase
  bases = (<class 'abc.ABC'>, <class '_ctypes.Structure'>)
  namespace = {'__module__': '__main__', '__qualname__': 'MessageBase', '__init__': <function MessageBase.__init__ at 0x2b4be2f9e9d8>, 'format': <property object at 0x2b4be2e81868>, '__classcell__': <cell at 0x2b4be2f7a1c8: empty>}
  kwargs = {}
<-- cls = <class '__main__.MessageBase'>

FinalMeta.__new__(mcs, name, bases, namespace, **kwargs)
  mcs = <class '__main__.FinalMeta'>
  name = ConcreteMessage
  bases = (<class '__main__.MessageBase'>,)
  namespace = {'__module__': '__main__', '__qualname__': 'ConcreteMessage', '_fields_': [('x', <class 'ctypes.c_int'>)], 'format': <property object at 0x2b4be2f83e08>}
  kwargs = {}
<-- cls = <class '__main__.ConcreteMessage'>

stderr
Traceback (most recent call last):
  File "./prog.py", line 37, in <module>
TypeError: abstract class