python 장식기가 중요한가요?
1. 장식기는 무엇입니까?
장식기가 무엇인지 이해하려면 우선 Python 처리 함수를 익혀야 합니다.그것의 관점에서 볼 때, 함수와 대상은 아무런 차이가 없다.다음과 같은 속성이 있습니다.
def func():
print('hello from func')
func()
> hello from func
new_func = func
new_func()
> hello from func
print(new_func.__name__)
> func
또한 매개변수로 다른 함수에 전달할 수도 있습니다.
def func():
print('hello from func')
def call_func_twice(callback):
callback()
callback()
call_func_twice(func)
> hello from func
> hello from func
이제 장식기를 소개합니다.장식기 (decorator) 는 함수나 클래스의 행동을 수정하는 데 사용됩니다.이를 실현하는 방법은 다른 함수를 되돌려주는 함수 (장식기) 를 정의하는 것이다.이것은 매우 복잡하게 들리지만, 이 예를 통해 당신은 모든 것을 이해할 수 있다.
def logging_decorator(func):
def logging_wrapper(*args, **kwargs):
print(f'Before {func.__name__}')
func(*args, **kwargs)
print(f'After {func.__name__}')
return logging_wrapper
@logging_decorator
def sum(x, y):
print(x + y)
sum(2, 5)
> Before sum
> 7
> After sum
우리 한 걸음 한 걸음 하자.2. 장식기가 필요한 이유
이것은 매우 간단하다: 가독성.Python은 명확하고 간결한 문법으로 칭찬을 받았고 장식기도 예외가 아니다.만약 여러 함수가 공유된 행동이 있다면, 장식기를 만들어야 할 수도 있습니다.다음은 도움이 될 수 있는 몇 가지 예입니다.
지금 우리는 몇 가지 코드 예시를 열거할 것이다.
3. 예
반환 값이 있는 장식기
만약 우리가 모든 함수를 호출하는 데 얼마나 걸릴지 알고 싶다면.그리고 함수는 대부분 물건을 되돌려주기 때문에 장식기도 그것을 처리해야 한다.
def timer_decorator(func):
def timer_wrapper(*args, **kwargs):
import datetime
before = datetime.datetime.now()
result = func(*args,**kwargs)
after = datetime.datetime.now()
print "Elapsed Time = {0}".format(after-before)
return result
@timer_decorator
def sum(x, y):
print(x + y)
return x + y
sum(2, 5)
> 7
> Elapsed Time = some time
다섯 번째 줄의result에 되돌아오는 값을 저장할 수 있습니다.그러나 되돌아오기 전에 우리는 함수에 대한 시간을 완성해야 한다.이것은 장식자가 없으면 실현할 수 없는 행위의 예이다.파라미터가 있는 장식기
때때로, 우리는 값을 받아들이는 장식기를 원한다. (예를 들어 Flask의 @app.route ('/login'):
def permission_decorator(permission):
def _permission_decorator(func):
def permission_wrapper(*args, **kwargs):
if someUserApi.hasPermission(permission):
result = func(*args, **kwargs)
return result
return None
return permission wrapper
return _permission_decorator
@permission_decorator('admin')
def delete_user(user):
someUserApi.deleteUser(user)
이 점을 실현하기 위해서, 우리는 하나의 매개 변수를 받아들이고 장식기를 되돌려주는 추가 함수를 정의했다.종류가 있는 장식기
클래스 대체 함수를 사용하여 수식하는 것은 가능하다.유일한 차이점은 문법이므로 더 익숙한 문법을 사용하십시오.다음은 클래스를 사용하여 다시 쓰는 로그 장식기입니다.
class Logging:
def __init__(self, function):
self.function = function
def __call__(self, *args, **kwargs):
print(f'Before {self.function.__name__}')
self.function(*args, **kwargs)
print(f'After {self.function.__name__}')
@Logging
def sum(x, y):
print(x + y)
sum(5, 2)
> Before sum
> 7
> After sum
이렇게 하면 플러그인 함수를 처리할 필요가 없다는 것이 장점이다.클래스를 정의하고 덮어쓰는 것이 필요합니다 _call__방법장식류
때때로, 당신은 클래스의 모든 방법을 수식하고 싶을 수도 있습니다.이렇게 써도 돼요.
class MyClass:
@decorator
def func1(self):
pass
@decorator
def func2(self):
pass
하지만 방법이 많으면 통제력을 잃을 수도 있다.다행히도 한 번에 반 전체를 장식할 수 있는 방법이 있다.
def logging_decorator(func):
def logging_wrapper(*args, **kwargs):
print(f'Before {func.__name__}')
result = func(*args, **kwargs)
print(f'After {func.__name__}')
return result
return logging_wrapper
def log_all_class_methods(cls):
class NewCls(object):
def __init__(self, *args, **kwargs):
self.original = cls(*args, **kwargs)
def __getattribute__(self, s):
try:
x = super(NewCls,self).__getattribute__(s)
except AttributeError:
pass
else:
return x
x = self.original.__getattribute__(s)
if type(x) == type(self.__init__):
return logging_decorator(x)
else:
return x
return NewCls
@log_all_class_methods
class SomeMethods:
def func1(self):
print('func1')
def func2(self):
print('func2')
methods = SomeMethods()
methods.func1()
> Before func1
> func1
> After func1
지금 당황하지 마세요.이것은 보기에는 매우 복잡하지만 논리는 같다.자신의 decorator를 정의할 수 있을 뿐만 아니라 표준 라이브러리에도 decorator를 제공합니다.나는 나와 함께 가장 많이 일하는 세 사람을 열거할 것이다.
@property - 플러그인을 내장한 장식기입니다. 클래스 속성에 getter와setter를 정의할 수 있습니다.
@lru_cache - functools 모듈의 장식기.그것은 함수 매개 변수와 반환 값을 기억하는데, 이것은 순수한 함수 (예를 들어 곱하기) 에 매우 편리하다.
@abstractmethod - abc 모듈의 장식기.이 방법은 추상적이고 세부적인 것이 부족하다는 것을 지시한다.
이상은python 장식기가 어디에 중요한지에 대한 상세한 내용입니다.python 장식기에 대한 더 많은 자료는 저희 다른 관련 글에 주목하세요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.