python 장식기 코드 깊이 설명

5249 단어 python장식기
python 장식기는 원함수 기능을 확장하는 함수이다. 이 함수의 특수한 점은 그 반환값도 함수이다. python 장식기를 사용하는 장점 중 하나는 원함수 코드를 수정할 필요가 없는 상황에서 함수에 새로운 기능을 추가하는 것이다.

먼저 예를 살펴보겠습니다.


def say():
 print('Nice day')

say()
#  :
Nice day
이제 출력Nice day 앞에서 다음 효과와 같이 한 줄****************을 인쇄하고 싶습니다.
**************** 
Nice day

일반적인 경우, 나는 위의 코드를 수정할 수 있다.


def say():
 print('****************')
 print('Nice day')

say()
그러나 만약에 내가 갑자기 수요를 잘못 보았다는 것을 발견하면 이때 코드를 원래의 모습으로 수정해야 한다. 다행히도 나는 원래 함수를 바탕으로 코드를 한 줄 늘렸을 뿐이다. 원래의 상태로 돌아가는 것은 어렵지 않다. 그러나 만약에 내가 복잡한 논리를 수정했다면 코드가 백 줄이 있는데 내가 한 걸음 한 걸음 철회해야 하는가?분명히 할 수 없지만 괜찮아요. 다른 방법이 있을 거예요.

def say():
 print('Nice day')

def outer(): #  
 print('****************') #  
 say() #  

outer()
#  :
'''
****************
Nice day
'''
어때, 이미 요구를 충족시킨 것 같지만, 자세히 보면 새로운 문제를 발견할 수 있다. 만약 say() 함수가 인쇄****************뿐만 아니라, 새로 온 talk() 함수도 필요하다면, 이때 나는 또 outer() 함수를 하나 더 써야 합니까?이것은 단단을 지치게 할 것이니 다시 방법을 강구해야 한다.

def say():
 print('Nice day')

def talk():
 print('I am talk')

def outer(func): #  
 print('****************') #  
 func() #  

outer(talk) #  talk 
#  :
'''
****************
I am talk
'''
이때 몇 개의 함수를 인쇄해야 하든****************, 내가 직접 함수 이름을 outer() 전달하면 돼. 많이 편리하지 않아^-^하지만 부지런한 단단은 여기서 멈추지 않을까?틀림없이 그럴 리가 없다. 그래서 코드를 다음과 같이 수정했다.

def say():
 print('Nice day')

def outer(func):
 def inner():
 print('****************')
 func() #   say()
 return inner

s = outer(say) #   s = inner
s() #   inner()
이번에는 출력이 뭔지 맞혀보세요~ 물론 위와 같죠!사실 여기는 처리 논리의 일부분을 하나의 함수에 봉인했을 뿐입니다. 호출outer(say)할 때 say 전송outer 반환값inner 획득s, 이때s 해당inner, s() 해당하기 때문에 출력됩니다.
**************
Nice day
이것이 바로 가장 간단한 장식기입니다. 아주 간단하지 않습니까~하지만 우리가 사용할 때마다 변수(여기 s)에 먼저 값을 부여한 다음에 s를 통해 호출해야 합니다. 단단의'코드 한 줄이 많으면 군더더기'원칙에 어긋나기 때문에 우리는 코드를 다시 수정합니다.

def outer(func):
 def inner():
 print('****************')
 func()
 return inner

@outer #  outer say
def say():
 print('Nice day')

say() #  say 
inner()outer를 위치를 바꿔서 say 함수를 정의했습니다. outer@outer장식outer을 표시했습니다. 이렇게 직접say을 사용하면 한 줄say()을 먼저 출력하고 싶은 기능을 실현할 수 있습니다. 두 함수의 위치를 바꾸지 않으면 회보****************의 오류입니다.하하
이때 많은 세심한 학우들이 틀림없이 물어볼 것이다. 네가 쓴 것은 모두 무참한 것이다. 그러면 내 함수에 파라미터가 있으면 어떡하지, 파라미터가 고정되지 않으면 어떡하지?만능의python+똑똑한 단단이 해결할 수 있지:

#  
def outer(func):
 def inner(name):
 func(name)
 return inner

@outer
def say(name):
 print('name is %s.' % (name))

say('dandan')
# name is dandan.
그러나 이 매개 변수의 개수는 고정되어 있다. 만약에 내가 또 갑자기 기이한 생각을 하게 된다면 NameError: name 'outer' is not defined 또는 outer 을 하나 더 전달하려면 어떻게 해야 합니까?

#  
def outer(func):
 def inner(*args, **kwargs):
 func(*args, **kwargs)
 return inner

@outer
def say(name, age):
 print('name is %s, age is %d.' % (name, age))

@outer
def talk(name, age, hobby):
 print('name is %s, age is %d, hobby is %s.' % (name, age, hobby))

say('dandan', 18)
talk('dandan', 18, 'Coding')
'''
name is dandan, age is 18.
name is dandan, age is 18, hobby is Coding.
'''
만약 내가 새로 추가해야 할 기능이 매우 많은데, 장식기 하나가 정해지지 않으면 어떻게 합니까?여러 개의 장식기를 동시에 사용할 수 있습니까?물론:

#  
def outer(func):
 def inner(*args, **kwargs):
 print('****************')
 func(*args, **kwargs)
 return inner

def outer2(func):
 def inner2(*args, **kwargs):
 print(' 1w+ ')
 func(*args, **kwargs)
 return inner2

@outer
@outer2
def say(name, age):
 print('name is %s, age is %d.' % (name, age))

@outer
@outer2
def talk(name, age, hobby):
 print('name is %s, age is %d, hobby is %s.' % (name, age, hobby))

say('dandan', 18)
talk('dandan', 18, 'Coding')
'''
****************
 1w+ 
name is dandan, age is 18.
****************
 1w+ 
name is dandan, age is 18, hobby is Coding.
'''
주의해야 할 것은 여러 개의 장식기의 실행 순서는 첫 번째 장식기부터 마지막 장식기까지 실행하고 함수 자체를 실행하는 것이다.
이python 장식기 코드에 대해 깊이 있게 설명한 이 글은 여기까지 소개되었습니다. 더 많은 python 장식기 내용은 저희 이전의 글을 검색하거나 아래의 관련 글을 계속 훑어보시기 바랍니다. 앞으로 많은 응원 부탁드립니다!

좋은 웹페이지 즐겨찾기