python 의 장식 기 역할 이해

2912 단어 python장식 기
장식 기의 역할 은 새로운 함수 로 구 함수(구 함수 코드 가 변 하지 않 는 상황 에서 기능 추가)를 밀봉 한 다음 에 새로운 함수 로 돌아 가 는 것 입 니 다.새로운 함 수 는 장식 기 라 고 합 니 다.일반적으로 장식 기 를 간소화 하기 위해 문법 당@새로운 함수 로 간략화 합 니 다.
예:
이것 은 코드 이지 만 기능 이 너무 적어 서 이것 을 강화 해 야 하지만 코드 를 바 꿀 수 없습니다.

def hello():
    return "hello world!"
현재 우리 의 수 요 는 hello()함수 의 기능 을 강화 하 는 것 입 니 다.반환 에 HTML 라벨 을 추가 하 기 를 바 랍 니 다.예 를 들 어hello world.그러나 hello()함수 의 원래 정 의 를 바 꾸 지 말 라 고 요구 합 니 다.

def makeitalic(fun):#makitalic       
    def wrapped():#    
        return "<i>"+fun()+"</i>"#      
    return wrapped#    wrapped    

def hello():#         
    return "hello world!"
#makeitalic     hello  ,      fun()       hello   
hello_2=makeitalic(hello)
#     ,     <i>hello world!</i>
print(hello_2())
원 함수 hello 의 기능 을 강화 하기 위해 함 수 를 정 의 했 습 니 다.원 함 수 를 매개 변수 로 받 아들 이 고 새로운 함 수 를 되 돌려 주 었 습 니 다.이 되 돌아 오 는 함수 에서 원 함 수 를 실 행 했 고 원 함수 의 기능 을 강화 하 였 습 니 다.
사실 Makeitalic 는 장식 기(decorator)입 니 다.원 함수 hello 를 봉 하고 새로운 함 수 를 되 돌려 주 었 습 니 다.원 함수 의 기능 을 강화 하고 hello 에 값 을 부여 합 니 다.
일반적인 상황 에서 우 리 는 장식 기 가 제공 하 는@문법 사탕(Syntactic Sugar)을 사용 하여 위의 조작 을 간소화 합 니 다.

####  @   
def makeitalic(fun):
    def wrapped():
        return "<i>" + fun() + "</i>"
    return wrapped

@makeitalic#            ,      
def hello():
    return "hello world"
print(hello())#            ,      
위의 경우 함수(또는 클래스)기능 을 동적 으로 수정 할 수 있 는 함수 가 장식 기 입 니 다.본질 적 으로 이것 은 고급 함수 로 장식 되 어 있 는 함수(예 를 들 어 위의 hello)를 매개 변수 로 하고 포 장 된 함수(예 를 들 어 위의 wrapped)를 수식 함수(hello)에 되 돌려 줍 니 다.
hello()함 수 를 호출 할 때 hello 함수 의 실행 절 차 는 다음 과 같 습 니 다.
1.hello 함 수 를 매개 변수 로@기호 뒤의 장식 기 함수 에 전달 합 니 다.
2.그 다음 에 장식 기 함 수 를 실행 하고 포 장 된 함 수 를 되 돌려 주 는 동시에 원 함수 의 방향 을 바 꾸 었 습 니 다.현재 원 함수 가 이 포장 함 수 를 가리 키 고 있 습 니 다.
3.원 함 수 를 실행 합 니 다.사실은 이때 실 행 된 것 은 포 장 된 함수 입 니 다.그래서 장식 기 는 기 존 함수 의 기능 을 강화 하지만 기 존 함수 의 정 의 를 바 꾸 지 않 습 니 다.
일반 장식 기의 사용 형식:

@decorator
def fun():
 pass

#        :

def fun():
 pass
fun = decorator(fun)#           
장식 기 는 여러 개 를 정의 할 수 있 습 니 다.함수 정의 에서 가장 가 까 운 장식 기 가 가장 먼저 호출 됩 니 다.예 를 들 어:

@decotator_one
@decorator_two
def fun():
 pass

#       :

def fun():
 pass
fun = decorator_one(decorator_two(fun))
장식 기 는 파 라 메 터 를 가 져 갈 수 있 습 니 다.예 를 들 어:

@decorator(arg1, arg2)
def fun():
 pass

#       :

def fun():
 pass
fun = decorator(arg1, arg2)(fun)
python 의 인 테 리 어 역할 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 python 인 테 리 어 역할 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기