PY_func | decorator, 함수를 꾸며주자.

Stellar·2023년 11월 2일
0

Python

목록 보기
28/36
post-custom-banner

decorator란?

어떤 함수가 있을 때 해당 함수를 직접 수정하지 않고 함수에 기능을 추가하고자 할 때 데코레이터를 사용
코딩 도장 Unit 42. 데코레이터 사용하기

✔️ 데코레이터 wrapper 예제.

def inner() :
    print('결과를 출력합니다.')

# 데코레이터 outer()함수가 inner() 함수를 감싸 장식
def outer(func) :
    print('=' * 20)
    func() #inner 함수가 실행 됨.
    print('=' * 20)

outer(inner)

✔️ 데코레이터 wrapper 예제2. 호출 방법이 다름.

# wrapper 2
def inner():
    print('결과를 출력합니다')

def outer(func) :
    def wrapper() :
        print('=' * 20)
        func()
        print('=' * 20)
    return wrapper

inner = outer(inner)
inner()

✔️ 데코레이터 예제3. @를 쓰면 데코레이터의 완성.

#decorator
def outer(func) :
    def wrapper() :
        print('=' * 20)
        func()
        print('=' * 20)
    return wrapper

@outer      #inner = outer(inner)
def inner() :
    print('결과를 출력합니다.')

inner()

✔️ 데코레이터 예제4. @ 데코 여러개 쓰기.

def para(func):
    def wrapper() :
        return '<p>' + str(func()) + '</p>'
    return wrapper

@para
def outname() :
    return '신상현'

@para
def outage() :
    return '29'

print(outname())
print(outage())

property

프로퍼티는 데코레이터의 함수이다. @property를 함수위에 붙이면 기존에 함수의 변수를 가져온다는 print(today.month) 코드가 클래스의 메소드 즉 함수를 불러온다고 지정하는 뜻이다.
참고
-[코드잇] 쉽게 배우는 파이썬 문법 - 프로퍼티(Property)-1
-[코드잇] 쉽게 배우는 파이썬 문법 - 프로퍼티(Property)-2
-Dale Seo [파이썬] property 사용법 (함수/데코레이터)

프로퍼티 예제. 함수 아래에 프로퍼티를 지정.

#property
class Date :
    def __init__(self, month) :
        self.inner_month = month #inner를 추가해야한다.

    def getMonth(self) :
        return self.inner_month

    def setMonth(self, month) :
        if 1 <= month <= 12 :
            self.__month = month
        else :
            print('해당되지 않는 월입니다.')
            
    month = property(getMonth, setMonth)

today = Date(8)
print(today.getMonth())
today.month = 15
print(today.month)
print(today.getMonth())

프로퍼티 예제2. 함수 위에 @ 붙이기

#property 2
class Date :
    def __init__(self, month) :
        self.inner_month = month #inner를 추가해야한다.

    @property #호출 시 실행되는 함수
    def month(self) :
        return self.inner_month

    @month.setter #값 지정 시 실행 되는 함수
    def month(self, month) :
        if 1 <= month <= 12 :
            self.inner_month = month
        else :
            print('해당되지 않는 월입니다.')

today = Date(8)
today.month = 15
print(today.month)

✔️ 데코레이터 종류

- @property 실행

  • @함수명.setter 변수의 값을 변경

✔️ 함수 결과 값이 안나올 때

메소드는 소괄호를 꼭 붙일 것.
메소드 뒤에 괄호 ()를 안 붙인 경우 아래와 같이 결과 값이 출력 된다.

print('사각형의 면적', r.area)
print('사각형의 둘레', r.perimeter)
=============================== RESTART: C:\Users\GIEC\Desktop\기초문법\1103\test.py ==============================
사각형의 면적 <bound method Rectangle.area of <__main__.Rectangle object at 0x000001A0EB413B20>>
사각형의 둘레 <bound method Rectangle.perimeter of <__main__.Rectangle object at 0x000001A0EB413B20>>
post-custom-banner

0개의 댓글