Files
org-roamings/20220519090118-la_methode_prepare.org
2022-06-04 12:57:39 +02:00

60 lines
1.7 KiB
Org Mode

: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]]