使用元类"__init__"与"__new__"动态添加方法

Arc*_*oam 5 python metaclass dynamic

继续这个问题的讨论:动态添加有或没有元类的方法,在进行动态注入时,在__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)
Run Code Online (Sandbox Code Playgroud)

bru*_*ers 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
Run Code Online (Sandbox Code Playgroud)

因此,基本上,在Meta.__init__您只能修改已实例化类对象,而Meta.__new__您可以检查和修改家长和命名空间之前创建类以后修改创建的类.

那么使用的重点是__init__什么?好吧,有时你不需要所有的功能__new__,只需要修改新创建的类,然后为__init__你节省创建类的额外样板.