是否可以连接元类?
我有类Model,它使用__metaclass__=ModelBase来处理其命名空间字典.我将继承它并"绑定"另一个元类,因此它不会遮蔽原始元类.
第一种方法是子类class MyModelBase(ModelBase):
MyModel(Model):
__metaclass__ = MyModelBase # inherits from `ModelBase`
Run Code Online (Sandbox Code Playgroud)
但是,如果没有明确的子类化,是否可以像mixin一样链接它们?就像是
class MyModel(Model):
__metaclass__ = (MyMixin, super(Model).__metaclass__)
Run Code Online (Sandbox Code Playgroud)
......甚至更好:创建一个将使用__metaclass__它的类的直接父级使用的MixIn :
class MyModel(Model):
__metaclass__ = MyMetaMixin, # Automagically uses `Model.__metaclass__`
Run Code Online (Sandbox Code Playgroud)
原因是:为了更灵活地扩展现有应用程序,我想创建一个全局机制,用于挂钩Django中的,...定义过程Model,Form以便在运行时更改它.
一种常见的机制比使用回调mixin实现多个元类要好得多.
在你的帮助下,我终于找到了解决方案:元类MetaProxy.
这个想法是:创建一个元类,调用一个回调来修改正在创建的类的命名空间,然后,在其帮助下__new__,变异为其中一个父类的元类.
#!/usr/bin/env python
#-*- coding: utf-8 -*-
# Magical metaclass
class MetaProxy(type):
""" Decorate the class being created & preserve __metaclass__ of the parent
It executes two callbacks: before & after …Run Code Online (Sandbox Code Playgroud)