python 장식기의 기본 사용

7146 단어 python장식기

지식

  • 간단한 장식기
  • 파라미터가 있는 장식기
  • 사용자 정의 파라미터가 있는 장식기
  • 류 장식기
  • 장식기 끼워넣기
  • @functools.랩 장식기 사용
  • 기초 사용


    간단한 장식기

    
    def my_decorator(func):
      def wrapper():
        print('wrapper of decorator')
        func()
      return wrapper()
    
    
    def test():
      print('test done.')
    
    test = my_decorator(test)
    test
    
     :
    wrapper of decorator
    test done.
    이 코드에서 변수test는 내부 함수 wrapper () 를 가리키고 내부 함수 wrapper () 에서는 원 함수 test () 를 호출하기 때문에 마지막에 test () 를 호출할 때'wrapper of decorator'를 출력합니다.
    여기 함수 my_decorator () 는 진정으로 실행해야 할 함수test () 를 감싸고 행동을 바꾸는 장식기입니다. 그러나 원 함수test () 는 변하지 않습니다.
    위의 코드는 Python에서 보다 간단하고 우아하게 표현됩니다.
    
    def my_decorator(func):
      def wrapper():
        print('wrapper of decorator')
        func()
      return wrapper()
    
    @my_decorator
    def test():
      print('test done.')
    
    test
    여기의 @, 우리는 문법당이라고 부른다, @my_decorator는 앞의 test=my_에 해당합니다decorator 문장
    만약 프로그램에 또 다른 함수가 유사한 장식을 필요로 한다면 @decorator를 추가하면 함수의 중복 이용과 프로그램 가독성을 높일 수 있다

    파라미터가 있는 장식기

    
    def args_decorator(func):
      def wrapper(*args, **kwargs):
        print('wrapper of decorator')
        func(*args, **kwargs)
      return wrapper
    
    @args_decorator
    def identity(name, message):
      print('identity done.')
      print(name, message)
    
    identity('changhao', 'hello')
    
     :
    wrapper of decorator
    identity done.
    changhao hello
    일반적으로 args와 *kwargs를 장식기 내부 함수 wrapper () 의 매개 변수로 사용합니다.임의의 수량과 유형을 수용하는 매개 변수를 나타낸다

    사용자 정의 매개 변수가 있는 장식기


    장식기 내부 함수가 실행되는 횟수를 나타내는 매개변수를 정의합니다.
    
    def repeat(num):
      def my_decorator(func):
        def wrapper(*args, **kwargs):
          for i in range(num):
            func(*args, **kwargs)
        return wrapper
      return my_decorator
    
    
    @repeat(3)
    def showname(message):
      print(message)
    
    showname('changhao')
    
     :
    changhao
    changhao
    changhao

    클래스 장식기


    클래스도 장식기로 사용할 수 있습니다. 클래스 장식기는 주로 함수 __에 의존합니다call__예제를 호출할 때마다 함수 __call__() 한 번 실행됩니다.
    
    class Count:
      def __init__(self, func):
        self.func = func
        self.num_calls = 0
    
      def __call__(self, *args, **kwargs):
        self.num_calls += 1
        print('num of calls is: {}'.format(self.num_calls))
        return self.func(*args, **kwargs)
    
    
    @Count
    def example():
      print('example done.')
    
    example()
    example()
    
     :
    num of calls is: 1
    example done.
    num of calls is: 2
    example done.
    클래스 Count를 정의합니다. 초기화할 때 원래 함수 func()가 전달되고 __call__() 함수는 변수num_calls는 1을 추가한 후에 인쇄하고 원 함수를 호출합니다.그래서 우리가 함수 example () 를 처음 호출했을 때num_calls의 값은 1이고, 처음 호출했을 때, 값은 2로 바뀌었다.

    장식기의 끼워 넣기

    
    import functools
    def my_decorator1(func):
      @functools.wraps(func)
      def wrapper(*args, **kwargs):
        print('execute decorator1')
        func(*args, **kwargs)
      return wrapper
    
    
    def my_decorator2(func):
      @functools.wraps(func)
      def wrapper(*args, **kwargs):
        print('execute decorator2')
        func(*args, **kwargs)
      return wrapper
    
    
    @my_decorator1
    @my_decorator2
    def test2(message):
      print(message)
    
    
    test2('changhao')
    
     :
    execute decorator1
    execute decorator2
    changhao

    클래스 장식기


    클래스도 장식기로 사용할 수 있습니다. 클래스 장식기는 주로 함수 __에 의존합니다call__예제를 호출할 때마다 함수 __call__() 한 번 실행됩니다.
    
    class Count:
      def __init__(self, func):
        self.func = func
        self.num_calls = 0
    
      def __call__(self, *args, **kwargs):
        self.num_calls += 1
        print('num of calls is: {}'.format(self.num_calls))
        return self.func(*args, **kwargs)
    
    
    @Count
    def example():
      print('example done.')
    
    example()
    example()
    
     :
    num of calls is: 1
    example done.
    num of calls is: 2
    example done.
    클래스 Count를 정의합니다. 초기화할 때 원래 함수 func()가 전달되고 __call__() 함수는 변수num_calls는 1을 추가한 후에 인쇄하고 원 함수를 호출합니다.그래서 우리가 함수 example () 를 처음 호출했을 때num_calls의 값은 1이고, 처음 호출했을 때, 값은 2로 바뀌었다.

    장식기의 끼워 넣기

    
    import functools
    def my_decorator1(func):
      @functools.wraps(func)
      def wrapper(*args, **kwargs):
        print('execute decorator1')
        func(*args, **kwargs)
      return wrapper
    
    
    def my_decorator2(func):
      @functools.wraps(func)
      def wrapper(*args, **kwargs):
        print('execute decorator2')
        func(*args, **kwargs)
      return wrapper
    
    
    @my_decorator1
    @my_decorator2
    def test2(message):
      print(message)
    
    
    test2('changhao')
    
     :
    execute decorator1
    execute decorator2
    changhao

    @functools.랩 장식기 사용

    
    import functools
    def my_decorator(func):
      @functools.wraps(func)
      def wrapper(*args, **kwargs):
        print('wrapper of decorator')
        func(*args, **kwargs)
        return wrapper
    
    @my_decorator
    def test3(message):
      print(message)
    
    test3.__name__ 
    
     
    test3
    보통 내장된 장식기 @functools를 사용합니다.랩, 그는 원 함수의 원 정보를 보존할 것이다 (즉, 원 함수의 원 정보를 대응하는 장식기에 복사하는 것이다)

    장식기 용법 실례


    인증

    
    import functools
    
    def authenticate(func):
     @functools.wraps(func)
     def wrapper(*args, **kwargs):
      request = args[0]
      if check_user_logged_in(request):
       return func(*args, **kwargs)
        else:
       raise Exception('Authentication failed')
      return wrapper
    
    @authenticate
    def post_comment(request):
     pass
    이 코드에서 장식기authenticate를 정의했습니다.반면 함수post_comment () 는 사용자가 어떤 글에 대한 평론을 발표하는 것을 나타낸다.매번 이 함수를 호출하기 전에 사용자가 로그인 상태인지 확인하고 로그인 상태라면 이 동작을 허용합니다.로그인하지 않으면 허용되지 않습니다.

    로깅

    
    import time
    import functools
    
    def log_execution_time(func):
     @functools.wraps(func)
     def wrapper(*args, **kwargs):
      start = time.perf_counter()
      res = func(*args, **kwargs)
      end = time.perf_counter()
      print('{} took {} ms'.format(func.__name__, (end - start) * 1000))
      return wrapper
    
    @log_execution_time
    def calculate_similarity(times):
     pass
    여기 장식기 log_execution_time는 함수의 운행 시간을 기록하고 실행 결과를 되돌려줍니다.만약 당신이 어떤 함수의 실행 시간을 계산하고 싶다면, 이 함수 위에 @log_execution_타임이면 돼요.

    총결산


    이른바 장식기란 사실 장식기 함수를 통해 원함수의 일부 기능을 수정하여 원함수를 수정할 필요가 없게 하는 것이다.
    이상은python 장식기의 기본적인 사용에 대한 상세한 내용입니다. 더 많은python 장식기에 대한 자료는 저희 다른 관련 글에 주목하세요!

    좋은 웹페이지 즐겨찾기