Diferències
Ací es mostren les diferències entre la revisió seleccionada i la versió actual de la pàgina.
| Següent revisió | Revisió prèvia | ||
| development:python:decorators [05/09/2024 02:55] – creat mate | development:python:decorators [15/09/2024 23:48] (actual) – [Decorador con parámetros mediante clases] mate | ||
|---|---|---|---|
| Línia 2: | Línia 2: | ||
| /via: [[https:// | /via: [[https:// | ||
| * [[https:// | * [[https:// | ||
| - | * | ||
| == Decorador mediante una función | == Decorador mediante una función | ||
| <code python> | <code python> | ||
| Línia 40: | Línia 39: | ||
| == Decorador simple mediante Clases | == Decorador simple mediante Clases | ||
| + | (se puede crear una funcion estática '' | ||
| + | |||
| <code python> | <code python> | ||
| class Decorator(object): | class Decorator(object): | ||
| Línia 125: | Línia 126: | ||
| # en decorador despues de wrapee foo de fa fa | # en decorador despues de wrapee foo de fa fa | ||
| </ | </ | ||
| + | |||
| + | == Ejemplo decoración con clases | ||
| + | <code python> | ||
| + | # | ||
| + | # -*- coding: utf-8 -*- | ||
| + | |||
| + | from types import MethodType | ||
| + | |||
| + | class Decorator(): | ||
| + | def __init__(self, | ||
| + | print(f" | ||
| + | self.func = func | ||
| + | |||
| + | def __call__(self, | ||
| + | print(" | ||
| + | print(nom_funcio := self.func.__name__) | ||
| + | print(B.classvar) | ||
| + | |||
| + | retorn = self.func(*args, | ||
| + | print(" | ||
| + | |||
| + | return retorn | ||
| + | | ||
| + | def __get__(self, | ||
| + | # Retorna un método si se llama en una instancia | ||
| + | return self if instance is None else MethodType(self, | ||
| + | |||
| + | |||
| + | class Decorator2(): | ||
| + | def __init__(self, | ||
| + | print(f" | ||
| + | self.func = func | ||
| + | |||
| + | def __call__(self): | ||
| + | print(" | ||
| + | print(self.func.__name__) | ||
| + | print(B.classvar) | ||
| + | |||
| + | self.func(self) | ||
| + | print(" | ||
| + | |||
| + | |||
| + | class A(): | ||
| + | @staticmethod | ||
| + | def decorator(func): | ||
| + | def wrapper(*args, | ||
| + | print(" | ||
| + | |||
| + | print(nom_funcio := func.__name__) | ||
| + | print(B.classvar) | ||
| + | |||
| + | retorn = func(*args, | ||
| + | print(" | ||
| + | |||
| + | return retorn | ||
| + | |||
| + | |||
| + | return wrapper | ||
| + | |||
| + | |||
| + | class B(A): | ||
| + | classvar = None | ||
| + | |||
| + | def __init__(self, | ||
| + | self.var = var | ||
| + | B.classvar = var | ||
| + | |||
| + | def decorator(func): | ||
| + | def wrapper(*args, | ||
| + | print(" | ||
| + | | ||
| + | print(nom_funcio := func.__name__) | ||
| + | print(B.classvar) | ||
| + | |||
| + | retorn = func(*args, | ||
| + | | ||
| + | print(" | ||
| + | |||
| + | return retorn | ||
| + | | ||
| + | |||
| + | return wrapper | ||
| + | |||
| + | @Decorator | ||
| + | def run(self, | ||
| + | print(f" | ||
| + | |||
| + | @Decorator2 | ||
| + | def run2(self, | ||
| + | print(f" | ||
| + | | ||
| + | @A.decorator | ||
| + | def run3(self, | ||
| + | print(f" | ||
| + | |||
| + | @decorator | ||
| + | def run4(self, | ||
| + | print(f" | ||
| + | |||
| + | |||
| + | o = B(' | ||
| + | o.run() | ||
| + | o.run2() | ||
| + | o.run3() | ||
| + | o.run4() | ||
| + | print(o.__dict__) | ||
| + | </ | ||
| + | * '' | ||