>백엔드 개발 >파이썬 튜토리얼 >Python 데코레이터에 대한 자세한 설명

Python 데코레이터에 대한 자세한 설명

黄舟
黄舟원래의
2017-10-01 07:44:051489검색

이 기사는 주로 모든 사람이 Python 데코레이터에 대한 관련 정보를 간단하고 심도 있게 배울 수 있도록 작성되었습니다. 관심 있는 친구들이 참고할 수 있습니다.

이전에 데코레이터에 대해 배운 적이 있지만, 그렇지 않습니다. 많이 알고 있는데 호출 방법이 헷갈려서 그냥 현재 프로젝트를 최적화하고 싶어서 데코레이터를 사용해볼까

보세요. 코드에서 먼저:


import time


# 将函数作为参数传入到此方法....
def timeif(func):
  def wrapper(arg):
    print("in wrapper() %s" % (arg))
    start = time.clock()
    func(arg)
    end = time.clock()
    print("used: %s %s" % (end-start, arg))
  return wrapper


@timeif
def foo(arg):
  print("in foo() %s" % (arg))


if __name__ == '__main__':
  foo(" Hello ") # 表示执行foo函数....

내 의심은 반환이 명백하다는 것입니다. 논리적으로 말하면, 함수 이름은 함수 주소를 반환합니다! 내 이해에 문제가 있습니까? 그러다가 인터넷에서 정보를 확인해보니 또 종료가 되었어요.... 그런데 개인적으로 마음에 안 들었거든요. 그러다가 직접 분석해서 프로그램을 요약해 봤는데,
프로그램:


# coding=utf-8
# 带参数的函数 返回一个函数地址就行....
def funX(x):
  def funY():
    return x
  return funY


# 不带参数的函数....
def funX1():
  print("调用函数funX1")

  def funY1():
    print("调用函数funY1")
  return funY1


if __name__ == '__main__':
  # print(funX(5)()) # 调用有参数的嵌套函数...
  
  print(funX1()()) # 调用无参数的嵌套函数...

이것과 우리 데코레이터가 닮지 않나요? 이것은 우리의 데코레이터입니다! 따라서 위 프로그램에 따라 이해할 수 있습니다. 즉, 먼저 매개변수 수를 결정한 다음 별도로 전달한다는 의미입니다. 다음으로 코드를 다시 작성해 보겠습니다.


# coding=utf-8
import time


# 将函数作为参数传入到此方法....
def timeif(func):
  def wrapper(arg):
    print("in wrapper() %s" % (arg))
    start = time.clock()
    func(arg)
    end = time.clock()
    print("used: %s %s" % (end-start, arg))
  return wrapper


# @timeif
def foo(arg):
  print("in foo() %s" % (arg))


if __name__ == '__main__':
  timeif(foo)(' Hello')

위 내용은 Python 데코레이터에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.