:PROPERTIES:
:ID:       0d9a7351-babd-4394-9d95-1d40cb46f615
:mtime:    20220520230717
:ctime:    20220519090118
:END:
#+title: La méthode __prepare__

* Synthaxe
#+BEGIN_SRC python
class.__prepare__()
#+END_SRC
La méthode ~class.__prepare__~ :
 * Cf. [[https://peps.python.org/pep-3115/][PEP-3115 - Metaclasses in Python 3000]],
 * Est utilisé comme /namespace/ local pour tout le code du corps de la
   classe (prépare le contenu du dictionnaire /__dict__/ de l'instance).
 * Est appelée avant ~class.__new__~,
 * Doit retourner un objet /dictionary-like/,
 
* Exemples

#+BEGIN_SRC python :results output
class DummyMeta(type):

    @classmethod
    def __prepare__(mcs, name, bases, **kwargs):
        print('DummyMeta.__prepare__')
        return {'special': 1}
            
class Dummy(metaclass=DummyMeta):
    
    def __new__(cls, name):
        print(f'Dummy.__new__({name})')
        return super().__new__(cls)
    
    def __init__(self, name):
        super().__init__()
        self.name = name
        print(f'Dummy.__init__({self.name})')

dummy1, dummy2 = (Dummy(f'dummy{i + 1}') for i in range(2))
print(f'{dummy1.special=}')
dummy1.special += 1
print(f'{dummy1.special=}')
print(f'{dummy2.special=}')
#+END_SRC

#+RESULTS:
: DummyMeta.__prepare__
: Dummy.__new__(dummy1)
: Dummy.__init__(dummy1)
: Dummy.__new__(dummy2)
: Dummy.__init__(dummy2)
: dummy1.special=1
: dummy1.special=2
: dummy2.special=1

* Références
 * [[https://blog.ionelmc.ro/2015/02/09/understanding-python-metaclasses/][Understanding Python metaclasses - Ionel codelog]]
 * [[https://zestedesavoir.com/tutoriels/954/notions-de-python-avancees/4-classes/2-metaclasses/][Metaclasses - Zeste de savoir]]
