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)