使用元类“__init__”与“__new __”

时间:2015-09-18 09:38:41

标签: python dynamic metaclass

继续此问题的讨论:Dynamically adding methods with or without metaclass,在进行动态注入时,在__new__方法与__init__方法中执行此操作的区别和好处/问题是什么? ?

在引用的问题中,使用setattr添加了新方法。如果您在__new__方法中执行此操作,则需要修改dict参数。使用相同的例子,它将是这样的:

class Meta(type)
    def __new__(cls, clsname, bases, dct):
        def my_method(self, x):
            return x in self.letters

        dct[my_method.__name__] = my_method
        return super(Meta, cls).__new__(cls, clsname, bases, dct)

1 个答案:

答案 0 :(得分:5)

  

如果在新方法中执行此操作,则需要修改dict参数

嗯,不一定,您也可以在之后使用setattr 创建新的类对象,即:

class Meta(type)
    def __new__(cls, clsname, bases, dct):
        def my_method(self, x):
            return x in self.letters

        newclass =  super(Meta, cls).__new__(cls, clsname, bases, dct)
        setattr(newclass, my_method.__name__, my_method)
        return newclass

基本上,在Meta.__init__中,您只能修改已经实例化的类对象,而在Meta.__new__中,您可以在创建类之前检查和修改父项和命名空间 em>和之后修改创建的类。

那么使用__init__的重点是什么?好吧,有时你不需要所有的力量__new__让你只想修改新创建的类,然后__init__为你节省了创建类的额外模板。