from abc import ABCMeta, abstractmethod from types import new_class class MyABC(metaclass=ABCMeta): @abstractmethod def m(self): ... def m(self): ... namespace = dict(m=m) C = type("C", (MyABC,), namespace) C().m() # no error # C = new_class("C", (MyABC,), namespace) C().m() # error # ABCMeta.__prepare__ seems to be lopping off the `m` argument: assert ABCMeta.__prepare__("C", (MyABC,), namespace) # error; should contain `m`