From dd4f04fa56b2f0b1b86413d0bbfdcf40dde11d40 Mon Sep 17 00:00:00 2001 From: gwen Date: Thu, 4 Jun 2015 10:10:58 +0200 Subject: [PATCH] =?UTF-8?q?ajout=20de=20doc=20sur=20les=20m=C3=A9ta=20clas?= =?UTF-8?q?ses?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python/formation/classes.txt | 70 ++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/python/formation/classes.txt b/python/formation/classes.txt index 085c9d6..1ba2268 100644 --- a/python/formation/classes.txt +++ b/python/formation/classes.txt @@ -380,3 +380,73 @@ autre exemple : les méthodes statiques ... # do stuff here +métaclasses +----------------- + +>>> class A: +... pass +... +>>> type(A) + +>>> class B(object): pass +... +>>> type(B) + +>>> help(type) + +>>> C = type('C', (), {}) +>>> C + +>>> + +>>> type(object) + +>>> type(type) + +>>> isinstance(type, object) +True +>>> isinstance(object, type) +True +>>> + +:: + + class MaMetaClasse(type): + """Exemple d'une métaclasse.""" + def __new__(metacls, nom, bases, dict): + """Création de notre classe.""" + print("On crée la classe {}".format(nom)) + return type.__new__(metacls, nom, bases, dict) + + class MaClasse(object): + __metaclass__ = MaMetaClasse + + +exemple : forcer l'implémentation d'un singleton avec les métaclasses + +:: + + class Singleton(type): + instance = None + def __call__(cls, *args, **kw): + if not cls.instance: + cls.instance = super(Singleton, cls).__call__(*args, **kw) + return cls.instance + + class ASingleton(object): + __metaclass__ = Singleton + + a = ASingleton() + b = ASingleton() + assert a is b + print(a.__class__.__name__, b.__class__.__name__) + + class BSingleton(object): + __metaclass__ = Singleton + + c = BSingleton() + d = BSingleton() + assert c is d + print(c.__class__.__name__, d.__class__.__name__) + assert c is not a +