60 lines
1.7 KiB
Org Mode
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]]
|