python 장식기가 중요한가요?

5831 단어 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
우리 한 걸음 한 걸음 하자.
  • 우선, 우리는 첫 번째 줄에서 logging_를 정의합니다.decorator 함수.그것은 단지 하나의 매개 변수, 즉 우리가 수식해야 할 함수를 받아들인다
  • 내부에서 우리는 또 다른 함수를 정의했다:logging_wrapper.그리고 logging_래퍼, 원래의 수식 함수 대신 사용..
  • 일곱 번째 줄에서 장식기를sum 함수에 어떻게 응용하는지 볼 수 있습니다
  • 11줄에서, 우리가sum를 호출할 때, 그것은sum만 호출하는 것이 아니다.logging_ 호출됨래퍼,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
    지금 당황하지 마세요.이것은 보기에는 매우 복잡하지만 논리는 같다.
  • 우선, logging_decorator는 원형을 유지합니다.그것은 클래스의 모든 방법에 적용될 것이다..
  • 그리고 새로운 장식기를 정의합니다:log_all_class_methods.그것은 일반적인 장식기와 유사하지만, 한 종류로 되돌아온다
  • NewCls는 사용자 정의 ___를 가지고 있습니다.getattribute__.원본 클래스에 대한 모든 호출에 logging_decorator 장식 함수..
  • 내장된 수식자
    자신의 decorator를 정의할 수 있을 뿐만 아니라 표준 라이브러리에도 decorator를 제공합니다.나는 나와 함께 가장 많이 일하는 세 사람을 열거할 것이다.
    @property - 플러그인을 내장한 장식기입니다. 클래스 속성에 getter와setter를 정의할 수 있습니다.
    @lru_cache - functools 모듈의 장식기.그것은 함수 매개 변수와 반환 값을 기억하는데, 이것은 순수한 함수 (예를 들어 곱하기) 에 매우 편리하다.
    @abstractmethod - abc 모듈의 장식기.이 방법은 추상적이고 세부적인 것이 부족하다는 것을 지시한다.
    이상은python 장식기가 어디에 중요한지에 대한 상세한 내용입니다.python 장식기에 대한 더 많은 자료는 저희 다른 관련 글에 주목하세요!

    좋은 웹페이지 즐겨찾기