Mar-09-2020, 03:30 PM
You could perhaps return a parametrized metaclass with a function
from functools import lru_cache @lru_cache(None) def get_metaclass(arg): class MyMeta(type): def __new__(meta, name, bases, members): cls = type.__new__(meta, name, bases, members) cls.foo = lambda self, val: '{} {}!'.format(arg, val) return cls return MyMeta class A(metaclass=get_metaclass('Hello')): pass class B(metaclass=get_metaclass('Hello')): pass assert type(A) is type(B) # <-- A and B have the same metaclass. a = A() print(a.foo('World')) # <--- prints Hello World!