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 장식 기 탐구 와 파라미터 의 수령 은 바로 소 편 이 여러분 에 게 공유 한 모든 내용 입 니 다.여러분 에 게 참고 가 되 고 저희 도 많이 응원 해 주시 기 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.