I’ve always set up metaclasses something like this:
class SomeMetaClass(type):
def __new__(cls, name, bases, dict):
#do stuff here
But I just came across a metaclass that was defined like this:
class SomeMetaClass(type):
def __init__(self, name, bases, dict):
#do stuff here
Is there any reason to prefer one over the other?
Update: Bear in mind that I’m asking about using __new__ and __init__ in a metaclass. I already understand the difference between them in another class. But in a metaclass, I can’t use __new__ to implement caching because __new__ is only called upon class creation in a metaclass.
If you want to alter the attributes dict before the class is created, or change the bases tuple, you have to use
__new__. By the time__init__sees the arguments, the class object already exists. Also, you have to use__new__if you want to return something other than a newly created class of the type in question.On the other hand, by the time
__init__runs, the class does exist. Thus, you can do things like give a reference to the just-created class to one of its member objects.Edit: changed wording to make it more clear that by “object”, I mean class-object.