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/26 16:37] rootpython:decorateurs [2017/03/22 21:06] (Version actuelle) – [Built-in decorator] root
Ligne 4: Ligne 4:
  
 ===== Built-in decorator ===== ===== Built-in decorator =====
-  * @property transforme une fonction en propriété (en gros transforme une fonctionne comme une variable)+  * **@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 15: 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 47: 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 59: 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 75: Ligne 149:
 </code> </code>
  
-<code>+<code python>
 # MAUVAIS # MAUVAIS
 @decorate @decorate
Ligne 88: Ligne 162:
  
 Exemple :  Exemple : 
-<code>+<code python>
 # -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
  
python/decorateurs.1335458255.txt.gz · Dernière modification : 2012/04/26 16:37 de root