Outils pour utilisateurs

Outils du site


python:decorateurs

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
python:decorateurs [2012/04/22 13:32] rootpython:decorateurs [2017/03/22 21:06] (Version actuelle) – [Built-in decorator] root
Ligne 2: Ligne 2:
  
 Source : http://gillesfabio.com/blog/2010/12/16/python-et-les-decorateurs/ Source : http://gillesfabio.com/blog/2010/12/16/python-et-les-decorateurs/
 +
 +===== Built-in decorator =====
 +  * **@property** : transforme une fonction en propriété (en gros transforme une fonctionne comme une variable)
 +
 +<code python>
 +class C(object):
 +    def __init__(self):
 +        self._x = None
 +
 +    @property
 +    def x(self):
 +        """I'm the 'x' property."""
 +        return self._x
 +
 +    @x.setter
 +    def x(self, value):
 +        self._x = value
 +
 +    @x.deleter
 +    def x(self):
 +        del self._x
 +</code>
 +
 +<code python>
 +#!/usr/bin/env python3
 +# -*- coding: utf-8 -*-
 +
 +class myclass(object):
 +    x = 0
 +
 +    def __init__(self):
 +        print('init')
 +        self.x = 0
 +
 +    # Methode classique. Ne peux pas être appelée sans être instanciée
 +    # myclass().foo(1)
 +    # myclass.foo(1) >>> Erreur
 +    def foo(self, x):
 +        print("Executing foo ({} : {})".format(self, x))
 +        self.x+=x
 +
 +    # Pas besoin d'instancier la classe pour l'appeler. A accès aux attributs de la classe qui ne commencent pas par self. A accès aux méthodes qui ne sont pas instanciées (c'est à dire aux methodes qui n'ont pas de self => @classmethod et @staticmethod).
 +    # myclass().class_foo(1) >>> Appelle __init__ car on a instancié la classe
 +    # myclass.class_foo(1)
 +    @classmethod
 +    def class_foo(cls, x):
 +        print("Executing class_foo ({} : {})".format(cls, x))
 +        cls.x+=x
 +        cls.static_foo(1)
 +
 +    # Pas besoin d'instancier la classe pour l'appeler. Vu comme une simple fonction. N'a pas accès aux méthodes
 +    # myclass().static_foo(1) >>> Appelle __init__ car on a instancié la classe
 +    # myclass.static_foo(1)
 +    @staticmethod
 +    def static_foo(x):
 +        print("Executing static_foo ({})".format(x))
 +        x+=1
 +
 +if __name__ == '__main__':
 +    a=myclass()
 +    print('x = {}'.format(a.x))
 +    a.foo(1)
 +    print('x = {}'.format(a.x))
 +    a.class_foo(1)
 +    print('x = {}'.format(a.x))
 +    a.static_foo(1)
 +    print('x = {}'.format(a.x))
 +    print('*'*10)
 +    try:
 +        myclass.foo(1)
 +    except Exception as e:
 +        print(e)
 +    myclass.class_foo(1)
 +    myclass.static_foo(1)
 +</code>
  
 ===== Sans arguments ===== ===== Sans arguments =====
  
-<code>+<code python>
 def decorate(func): def decorate(func):
     def wrapper(*args, **kwargs):     def wrapper(*args, **kwargs):
Ligne 12: Ligne 87:
         # Post-traitement         # Post-traitement
         return response         return response
 +    wrapper.__doc__ = func.__doc__
 +    wrapper.__name__ = func.__name__
     return wrapper     return wrapper
 </code> </code>
  
 Exemple :  Exemple : 
-<code>+<code python>
 # -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
  
Ligne 44: Ligne 121:
 ===== Avec arguments ===== ===== Avec arguments =====
  
-<code>+<code python>
 def decorate(arg1, arg2, arg3):     def decorate(arg1, arg2, arg3):    
     def decorated(func):     def decorated(func):
Ligne 56: Ligne 133:
 </code> </code>
  
-<code>+<code python>
 def decorate(arg1='default', arg2=None, arg3=None):     def decorate(arg1='default', arg2=None, arg3=None):    
     def decorated(func):     def decorated(func):
Ligne 72: Ligne 149:
 </code> </code>
  
-<code>+<code python>
 # MAUVAIS # MAUVAIS
 @decorate @decorate
Ligne 85: Ligne 162:
  
 Exemple :  Exemple : 
-<code>+<code python>
 # -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
  
python/decorateurs.1335101554.txt.gz · Dernière modification : 2012/04/22 13:32 de root