1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| class MustHaveNameMate(type): def __new__(cls, name, bases, namespace, /, **kwds): if 'name' not in namespace: raise TypeError(f"错误:类{name}必须定义'name'属性")
return super().__new__(cls, name, bases, namespace, **kwds)
class MyClass(metaclass = MustHaveNameMate): name = "TestClass"
class BadClass(metaclass = MustHaveNameMate): pass
""" 输出 TypeError: 错误:类BadClass必须定义'name'属性 """
registry = {}
class RegisterMete(type): def __new__(cls, name, bases, namespace, /, **kwds): new_cls = super().__new__(cls, name, bases, namespace, **kwds)
registry[name] = new_cls
return new_cls class MyView(metaclass = RegisterMete): pass class AuthView(metaclass = RegisterMete): pass
print(registry)
""" 输出: {'MyView': <class '__main__.MyView'>, 'AuthView': <class '__main__.AuthView'>} """
def auto_save(self): print(f"真正保存{self.__class__.__name__}的数据...")
class AutoSaveMeta(type): def __new__(cls, name, bases, namespace, /, **kwds): namespace['save'] = auto_save
return super().__new__(cls, name, bases, namespace, **kwds) class Product(metaclass = AutoSaveMeta): pass
p = Product() p.save()
|