继续此问题的讨论: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)
答案 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__
为你节省了创建类的额外模板。