Python의 데코레이터에 대한 일반적인 문제 및 해결 방법
def decorator(func): def inner_function(): print("Before function") func() print("After function") return inner_function @decorator def hello(): print("Hello, World!") hello()
출력은 다음과 같습니다.
Before function Hello, World! After function
이 데코레이터 함수는 원래 함수가 실행되기 전후에 추가 정보를 인쇄합니다.
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")
출력 결과는 다음과 같습니다.
Decorator arg1=Hello, arg2=42 Hello, World!
이 예에서 데코레이터 함수decorator_with_args
는 두 개의 매개변수를 받은 다음 새 데코레이터 함수를 반환합니다. 새로운 데코레이터 함수는 대상 함수의 매개변수를 승인하고 매개변수를 인쇄하는 동안 대상 함수를 호출합니다.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
데코레이터의 내부 함수에서@functools.wraps
데코레이터는 다음과 같은 용도로 자주 사용됩니다. 원래 함수 메타 정보의 메타 정보를 유지합니다. 이렇게 하면 데코레이터가 함수 이름 및 문서 문자열과 같은 정보를 수정하여 발생하는 디버깅 문제를 피할 수 있습니다.
@functools.wraps(func)
는
__name__
및
__doc__
를 유지합니다. 원래 기능> 속성.
MyClass
에서 상속되는 새 클래스
NewClass
를 생성하고 추가 기능을 제공합니다. 원래 메소드에 추가되었습니다. 요약: Decorator는 Python의 매우 강력한 함수로, 기존 함수나 클래스의 동작을 수정하는 데 사용할 수 있습니다. 데코레이터를 사용할 때 추가 매개변수를 전달하는 방법, 원래 함수의 메타 정보를 유지하는 방법 등과 같은 몇 가지 문제에 직면할 수 있습니다. 위의 예는 코드 예와 함께 자세히 설명된 몇 가지 일반적인 문제에 대한 솔루션을 제공합니다. 데코레이터를 유연하게 사용하면 코드에 더 많은 확장성과 재사용성을 추가할 수 있습니다.
위 내용은 Python의 데코레이터에 대한 일반적인 문제와 해결 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!