python 장식 기 탐구 와 파라미터 수령

먼저 원문 으로:
현재,만약 에 우리 가 now()함수 의 기능 을 강화 해 야 한다 고 가정 합 니 다.예 를 들 어 함수 호출 전후 에 자동 으로 로 그 를 인쇄 하지만 now()함수 의 정 의 를 수정 하고 싶 지 않 습 니 다.코드 가 실행 되 는 동안 동적 으로 기능 을 추가 하 는 방식 을'장식 기'(Decorator)라 고 합 니 다.
본질 적 으로 decorator 는 함수 로 돌아 가 는 고급 함수 입 니 다.
Decorator 본질은 고급 함수 입 니까?
사악 함 을 믿 지 않 는 내 가 해 봤 는데..

def g():
 print("   G")
 return "G"

@g
def f():
 print("   F")
 return 1
'''
--------------------------------------------
line 5, in <module>
 @g
TypeError: g() takes 0 positional arguments but 1 was given
>>>
'''
실행 결 과 는 주석 에 있 습 니 다.
어색 합 니 다...g 는 인 자 를 강제로 막 았 습 니 다.그 인 자 는 g'수식 대상'이 어야 합 니 다.
수정 하고 계속...

def g(f):
 print("   G")
 return "G"

@g
def f():
 print("   F")
 return 1
'''
--------------------------------------------
   G
>>> f()
Traceback (most recent call last):
 File "<pyshell#0>", line 1, in <module>
 f()
TypeError: 'str' object is not callable
'''
str 대상 은 호출 될 수 없습니다.
검증 을 위해 서 나 는'G'를 2 로 바 꾸 었 다.
결국
TypeError: 'int' object is not callable
OK.대충 말 하면 장식 기 는 먼저'마개'의 매개 변수 에 의 해 호출 된 다음 에 반환 값 은 한 번 더 호출 되 어야 합 니 다.그러나 함수 만 호출 될 수 있 는 것 같 습 니 다.그래서 잘못 보고 하지 않 기 위해 장식 기 는 함수 로 돌아 가 야 합 니 다.장식 기 는 반드시 고급 함수 여야 합 니 다.
나 는 불복(~12408~)을 표시 합 니 다.함수 가 아 닙 니까?g 의 매개 변 수 는 함수 입 니 다.

def g(f):
 print("   G")
 return f

@g
def f():
 print("   F")
 return 1
'''
--------------------------------------------
   G
>>> f()
   F
'1'
'''
실행 에 성 공 했 습 니 다.하지만.....................................................................
의문점 1:인쇄 된"여 기 는 G 입 니 다"는 첫 번 째 줄 입 니 다."f()"를 입력 하기 전에 발생 한...
의문점 2:"f()"를 입력 한 후"여 기 는 G 입 니 다"가 나 오지 않 았 습 니 다.
\#g 함수 만 보면'고급 함수'가 아 닙 니 다.
성공 의 예 로,그것 은 너무 실패했다.
그래,항복 할 게.완 강 히 저항 하 는 것 도 별로 재미 없어.........................................................
패 킷 을 닫 고 우리 에 게 이 치 를 알려 주 었 습 니 다.반환 값 이 반드시 함수 라 는 것 을 확보 하기 위해 가장 좋 은 조 치 는'함수 내부 에서 현장에서 함 수 를 만 들 고 던 지 는 것'입 니 다.

def g(f):
 print("   G")
 def h():
  print('   H')
  return "H"
 return h

@g
def f():
 print("   F")
 return 1
'''
--------------------------------------------
   G
>>> f()
   H
'H'
>>> f()
   H
'H'
>>> 
'''
f 함수 가 실행 되 지 않 습 니 다.
그리고 두 로 그 는 안에 있 는 것 만 사용 할 수 있 습 니 다.
책 을 읽 고 h 함수 가 f()로 돌아 가면 f 함수 가 실 행 됩 니 다.

def g(f):
 print("   G")
 def h():
  print('   H')
  return f()
 return h

@g
def f():
 print("   F")
 return 1
'''
--------------------------------------------
   G
>>> f()
   H
   F
'1'
>>> f
<function g.<locals>.h at 0x0000020CBDBB6C80>
'''
책의 사고방식 에 따라 해석 하 다

'''
@g
def f():
 pass
>>>f()
   
>>>g(f) ()
g    ,  
>>>h ()
h    (    )
>>>f()
f  ,  1
>>>1
'''
매개 변 수 를 더 하면,

def g(f):
 print("   G")
 def h(*args,**kw):
  print('   H')
  return f(*args,**kw)
 return h

@g
def f(*args,**kw):
 print("   F")
 return "1"
'''
>>>f(*args,**kw)
   
>>>g(f) (*args,**kw)
g    ,  
>>>h (*args,**kw)
h    (    )
>>>f(*args,**kw)
f  ,  1
>>>1
'''
이 를 통 해 알 수 있 듯 이(*args,*kw)본 은 h 함수 에 의 해 가 져 갔 기 때문에 h 함 수 를 관찰 하고 h 는 그의 인 자 를 그대로 f 에 게 건 네 주 었 다.
슬기 로 운 나 는 나 쁜 생각 을 했다.

def g(f):
 print("   G")
 def h():#h     
  print('   H')
  return f
 return h

@g
def f(*args,**kw):
 print("   F")
 return "1"
'''
>>>f()(*args,**kw)
   
>>>g(f) ()(*args,**kw)
g    ,  
>>>h ()(*args,**kw)
h    ,h     
(    )
>>>f(*args,**kw)
f  ,  1
>>>1
'''
그러나 새로운 문제 가 왔 습 니 다.뒤에 f 호출 할 때 빈 괄호 를 더 넣 어야 합 니 다.그렇지 않 으 면...

'''
>>>f(*args,**kw)
   
>>>g(f) (*args,**kw)
g    ,  
>>>h (*args,**kw)
h    (    )  f
>>>f
        
'''
이상 에서 우리 에 게 이 치 를 알려 주 었 다."함수 의 집행 여 부 는 뒤에 괄호 가 있 느 냐 없 느 냐 에 달 려 있다."
예 를 들다

def m(a):
 print(a)
 return m

print(m(1)(2)(3)(4)(5)(6)(7)(8)(9)(10))
'''
-----------------------------
2
4
6
8
10
<function m at 0x000002832BDB10D0>
뇌 를 태 울 때
f = a.b.c()()[0]()[d()()[e]]
a 모듈 의 b 클래스 의 c 방법 은 고급 함수 입 니 다.마지막 으로 목록 을 되 돌려 줍 니 다.목록 에 함수 가 있 습 니 다.
함수 가 사전 을 다시 되 돌려 줍 니 다.
이상 의 이 평론 python 장식 기 탐구 와 파라미터 의 수령 은 바로 소 편 이 여러분 에 게 공유 한 모든 내용 입 니 다.여러분 에 게 참고 가 되 고 저희 도 많이 응원 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기