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)
如果在新方法中执行此操作,则需要修改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__你节省创建类的额外样板.