【发布时间】:2015-05-13 11:35:01
【问题描述】:
让我们有一个名为fields.py 的外部模块,它带有一个元类FieldModelMetaclass,它改变了类FieldModel:
# module fields.py
class FieldModelMetaclass(type):
def __new__(cls, name, bases, attrs):
# code to alter class creation
class FieldModel(object):
__metaclass__ = FieldModelMetaclass
print 'run at parse time BEFORE metaclass applies'
# module consumer.py
import fields
def adjust_metaclass_new(cls, name, bases, attrs):
# do an extra work on class `cls' and attributes `attrs'
# Is somehow possible from here alter `FieldModelMetaclass.__new__`
# by injection of adjust_metaclass_new to modify FieldModel
# before it gets instantiated ?
mymodel = fields.FieldModel()
据我所知,类的元类在编译运行时生效,所以在我导入定义的模块时,类已经受到影响。
如何在外部模块创建类时截取元类的影响?
【问题讨论】:
-
元类在运行时生效,而不是在编译时生效。但是,由于它是在在同一个模块中使用,因此在加载类语句时,您无法在元类已经被使用之前拦截它。
-
@MartijnPieters 哦,是的,我现在看到了 :) 当然 :)
-
@MartijnPieters 所以我要注入
Class.__new__方法,以便在每个类实例化时调用它吗? -
@MartijnPieters 谢谢。与直接修改元类定义相反,是否存在一些性能损失?
-
@DavidUnric:这取决于您在此处实际尝试做什么。每次创建实例时运行额外的 Python 代码显然比每次创建类时运行代码的“成本”要高。