On Wed, 2 Mar 2016 08:23 pm, ast wrote:
> An other question: > > What is the very first method launched when an instantiation is done ? > e.g obj = MyClass(0, 5, 'xyz') > > is it __call__ (from object or MyClass if overriden) ? No, not object or MyClass. The *metaclass* __call__ is called. For most objects, the metaclass is `type`. The metaclass is the type of the class: classes are objects too, which means that like all objects, they have a class. That is the metaclass. *** WARNING *** Metaclasses are a very advanced technique. You are not expected to understand this. > then _call__ launches __new__ and then __init__ > This would be coherent with the language > > or is it __new__ then __init__ as said on courses I read ? Let us create a metaclass that inherits from `type`: class Meta(type): def __new__(meta, name, bases, namespace): print "**Creating new Meta instance" print "Metaclass:", meta print "New class name:", name print "Base classes used:", bases print "Namespace used as class dict:", namespace return type.__new__(meta, name, bases, namespace) def __init__(cls, *args): print "**Initialising Meta instance %s" % cls def __call__(cls): print "**Calling Meta instance %s" % cls return super(Meta, cls).__call__() Now let me use that metaclass to create a new class: class MyClass(object): __metaclass__ = Meta def __new__(cls): print "^^Creating new instance of %s" % cls return super(MyClass, cls).__new__(cls) def __init__(self): print "^^Initialising MyClass instance %s" % self def __call__(self): print "^^Calling MyClass instance %s" % self return "Hello World!" which prints: **Creating new Meta instance Metaclass: <class '__main__.Meta'> New class name: MyClass Base classes used: (<type 'object'>,) Namespace used as class dict: {'__call__': <function __call__ at 0xb7cfdf7c>, '__module__': '__main__', '__metaclass__': <class '__main__.Meta'>, '__new__': <function __new__ at 0xb7cfdf0c>, '__init__': <function __init__ at 0xb7cfdf44>} **Initialising Meta instance <class '__main__.MyClass'> Now let me create a new MyClass instance: instance = MyClass() which prints: **Calling Meta instance <class '__main__.MyClass'> ^^Creating new instance of <class '__main__.MyClass'> ^^Initialising MyClass instance <__main__.MyClass object at 0xb7cf2bec> Finally, let me call the instance: print instance() which prints: ^^Calling MyClass instance <__main__.MyClass object at 0xb7cf2bec> Hello World! -- Steven -- https://mail.python.org/mailman/listinfo/python-list