Problèmes courants et solutions pour les décorateurs en Python
def decorator(func): def inner_function(): print("Before function") func() print("After function") return inner_function @decorator def hello(): print("Hello, World!") hello()
Le résultat est :
Before function Hello, World! After function
Cette fonction de décorateur imprimera des informations supplémentaires avant et après l'exécution de la fonction d'origine.
def decorator_with_args(arg1, arg2): def decorator(func): def inner_function(*args, **kwargs): print(f"Decorator arg1={arg1}, arg2={arg2}") func(*args, **kwargs) return inner_function return decorator @decorator_with_args("Hello", 42) def hello(name): print(f"Hello, {name}!") hello("World")
Le résultat de sortie est :
Decorator arg1=Hello, arg2=42 Hello, World!
Dans cet exemple, la fonction de décorateurdecorator_with_args
reçoit deux paramètres puis renvoie une nouvelle fonction de décorateur. La nouvelle fonction décorateur accepte les paramètres de la fonction cible et appelle la fonction cible lors de l'impression des paramètres.decorator_with_args
接收两个参数,然后返回一个新的装饰器函数。新的装饰器函数接受目标函数的参数,并在打印参数的同时调用目标函数。
@functools.wraps
装饰器来保留原始函数的元信息。这样可以避免因装饰器修改了函数名、文档字符串等信息而导致调试困难。import functools def decorator(func): @functools.wraps(func) def inner_function(*args, **kwargs): print("Before function") func(*args, **kwargs) print("After function") return inner_function @decorator def hello(): """This is the Hello function.""" print("Hello, World!") print(hello.__name__) print(hello.__doc__)
输出结果为:
hello This is the Hello function.
这个例子中,@functools.wraps(func)
保留了原始函数的__name__
和__doc__
属性。
def decorator(cls): class NewClass(cls): def decorated_method(self): print("Decorated method") super().decorated_method() return NewClass @decorator class MyClass: def decorated_method(self): print("Original method") obj = MyClass() obj.decorated_method()
输出结果为:
Decorated method Original method
这个例子中,装饰器函数创建了一个新的类NewClass
,该类继承自原始类MyClass
Dans la fonction interne du décorateur, le décorateur@functools.wraps
est souvent utilisé pour conserver les méta-informations de la fonction d'origine. Méta-informations. Cela peut éviter les difficultés de débogage causées par la modification par le décorateur d'informations telles que les noms de fonctions et les chaînes de documentation.
@functools.wraps(func)
conserve le
__name__
et le
__doc__
de la fonction d'origine > Propriétés.
NewClass
, qui hérite de la classe d'origine
MyClass
, et des fonctionnalités supplémentaires a été ajouté à la méthode originale. Résumé : Decorator est une fonction très puissante en Python, qui peut être utilisée pour modifier le comportement de fonctions ou de classes existantes. Lors de l'utilisation de décorateurs, vous pouvez rencontrer certains problèmes, tels que comment transmettre des paramètres supplémentaires, comment conserver les méta-informations de la fonction d'origine, etc. Les exemples ci-dessus fournissent des solutions à certains problèmes courants, détaillées avec des exemples de code. En utilisant les décorateurs de manière flexible, nous pouvons ajouter plus d'évolutivité et de réutilisabilité à notre code.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!