from ctypes import *
from abc import ABC, abstractmethod, ABCMeta
class FinalMeta(ABCMeta, type(Structure)):
def __new__(mcs, name, bases, namespace, **kwargs):
print("FinalMeta.__new__(mcs, name, bases, namespace, **kwargs)")
print(" mcs =", mcs)
print(" name =", name)
print(" bases =", bases)
print(" namespace =", namespace)
print(" kwargs =", kwargs)
#Here you should call the type __new__ method
cls = type.__new__(mcs, name, bases, namespace, **kwargs)
print("<-- cls =", cls)
print()
return cls
class MessageBase(ABC, Structure, metaclass=FinalMeta):
def __init__(self, *args, **kwargs):
super().__init__()
@property
@abstractmethod
def format(self):
pass
class ConcreteMessage(MessageBase):
_fields_ = [("x", c_int)]
@property
def format(self):
return "dummy"
ConcreteMessage(1)
ZnJvbSBjdHlwZXMgaW1wb3J0ICoKZnJvbSBhYmMgaW1wb3J0IEFCQywgYWJzdHJhY3RtZXRob2QsIEFCQ01ldGEKCgpjbGFzcyBGaW5hbE1ldGEoQUJDTWV0YSwgdHlwZShTdHJ1Y3R1cmUpKToKICAgIGRlZiBfX25ld19fKG1jcywgbmFtZSwgYmFzZXMsIG5hbWVzcGFjZSwgKiprd2FyZ3MpOgogICAgICAgIHByaW50KCJGaW5hbE1ldGEuX19uZXdfXyhtY3MsIG5hbWUsIGJhc2VzLCBuYW1lc3BhY2UsICoqa3dhcmdzKSIpCiAgICAgICAgcHJpbnQoIiAgbWNzID0iLCBtY3MpCiAgICAgICAgcHJpbnQoIiAgbmFtZSA9IiwgbmFtZSkKICAgICAgICBwcmludCgiICBiYXNlcyA9IiwgYmFzZXMpCiAgICAgICAgcHJpbnQoIiAgbmFtZXNwYWNlID0iLCBuYW1lc3BhY2UpCiAgICAgICAgcHJpbnQoIiAga3dhcmdzID0iLCBrd2FyZ3MpCiAgICAgICAgI0hlcmUgeW91IHNob3VsZCBjYWxsIHRoZSB0eXBlIF9fbmV3X18gbWV0aG9kCiAgICAgICAgY2xzID0gdHlwZS5fX25ld19fKG1jcywgbmFtZSwgYmFzZXMsIG5hbWVzcGFjZSwgKiprd2FyZ3MpCiAgICAgICAgcHJpbnQoIjwtLSBjbHMgPSIsIGNscykKICAgICAgICBwcmludCgpCiAgICAgICAgcmV0dXJuIGNscwoKCgoKY2xhc3MgTWVzc2FnZUJhc2UoQUJDLCBTdHJ1Y3R1cmUsIG1ldGFjbGFzcz1GaW5hbE1ldGEpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXygpCgogICAgQHByb3BlcnR5CiAgICBAYWJzdHJhY3RtZXRob2QKICAgIGRlZiBmb3JtYXQoc2VsZik6CiAgICAgICAgcGFzcwoKY2xhc3MgQ29uY3JldGVNZXNzYWdlKE1lc3NhZ2VCYXNlKToKICAgIF9maWVsZHNfID0gWygieCIsIGNfaW50KV0KICAgIEBwcm9wZXJ0eQogICAgZGVmIGZvcm1hdChzZWxmKToKICAgICAgICByZXR1cm4gImR1bW15IgoKQ29uY3JldGVNZXNzYWdlKDEp
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'>
Traceback (most recent call last):
File "./prog.py", line 37, in <module>
TypeError: abstract class