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 장식기 내용은 저희 이전의 글을 검색하거나 아래의 관련 글을 계속 훑어보시기 바랍니다. 앞으로 많은 응원 부탁드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.