Diferències

Ací es mostren les diferències entre la revisió seleccionada i la versió actual de la pàgina.

Enllaç a la visualització de la comparació

Ambdós costats versió prèvia Revisió prèvia
development:python:decorators [12/09/2024 03:54] matedevelopment:python:decorators [15/09/2024 23:48] (actual) – [Decorador con parámetros mediante clases] mate
Línia 126: Línia 126:
 # en decorador despues de wrapee foo de fa fa # en decorador despues de wrapee foo de fa fa
 </code> </code>
 +
 +== Ejemplo decoración con clases
 +<code python>
 +#!/usr/bin/env python3
 +# -*- coding: utf-8 -*-
 +
 +from types import MethodType
 +
 +class Decorator():
 +    def __init__(self,func):
 +        print(f"Decorator.__init__")
 +        self.func = func
 +
 +    def __call__(self, *args, **kwargs):
 +        print("Decorator pre")
 +        print(nom_funcio := self.func.__name__)
 +        print(B.classvar)
 +
 +        retorn = self.func(*args,nom_funcio=nom_funcio,**kwargs)
 +        print("Decorator post")
 +
 +        return retorn
 +    
 +    def __get__(self,instance,cls):
 +        # Retorna un método si se llama en una instancia
 +        return self if instance is None else MethodType(self, instance)
 +
 +
 +class Decorator2():
 +    def __init__(self,func):
 +        print(f"Decorator2.__init__")
 +        self.func = func
 +
 +    def __call__(self):
 +        print("Decorator2 pre")
 +        print(self.func.__name__)
 +        print(B.classvar)
 +
 +        self.func(self)
 +        print("Decorator2 post")
 +
 +
 +class A():
 +    @staticmethod
 +    def decorator(func):
 +        def wrapper(*args,**kwargs):
 +            print("A.decorator pre")
 +
 +            print(nom_funcio := func.__name__)
 +            print(B.classvar)
 +
 +            retorn = func(*args,nom_funcio=nom_funcio,**kwargs)
 +            print("A.decorator post")
 +
 +            return retorn
 +
 +
 +        return wrapper
 +
 +
 +class B(A):
 +    classvar = None
 +
 +    def __init__(self,var=None):
 +        self.var = var
 +        B.classvar = var
 +
 +    def decorator(func):
 +        def wrapper(*args,**kwargs):
 +            print("decorator pre")
 +            
 +            print(nom_funcio := func.__name__)
 +            print(B.classvar)
 +
 +            retorn = func(*args,nom_funcio=nom_funcio,**kwargs)
 +            
 +            print("decorator post")
 +
 +            return retorn
 +        
 +
 +        return wrapper  
 +
 +    @Decorator
 +    def run(self,nom_funcio=None):
 +        print(f"B.run({nom_funcio})")
 +
 +    @Decorator2
 +    def run2(self,nom_funcio=None):
 +        print(f"B.run2({nom_funcio})")
 +        
 +    @A.decorator
 +    def run3(self,nom_funcio=None):
 +        print(f"B.run3({nom_funcio})")
 +
 +    @decorator
 +    def run4(self,nom_funcio=None):
 +        print(f"B.run4({nom_funcio})")
 +
 +
 +o = B('mate')
 +o.run()
 +o.run2()
 +o.run3()
 +o.run4()
 +print(o.__dict__)
 +</code>
 +  * ''classvar'' se usa como variable de intercambio de información, pero es una variable de clase. Varias instancias para diferentes cometidos darian conflictos.
  
  
  • development/python/decorators.1726138480.txt.gz
  • Darrera modificació: 12/09/2024 03:54
  • per mate