어떤 함수가 있을 때 해당 함수를 직접 수정하지 않고 함수에 기능을 추가하고자 할 때 데코레이터를 사용
코딩 도장 Unit 42. 데코레이터 사용하기
def inner() :
print('결과를 출력합니다.')
# 데코레이터 outer()함수가 inner() 함수를 감싸 장식
def outer(func) :
print('=' * 20)
func() #inner 함수가 실행 됨.
print('=' * 20)
outer(inner)
# wrapper 2
def inner():
print('결과를 출력합니다')
def outer(func) :
def wrapper() :
print('=' * 20)
func()
print('=' * 20)
return wrapper
inner = outer(inner)
inner()
#decorator
def outer(func) :
def wrapper() :
print('=' * 20)
func()
print('=' * 20)
return wrapper
@outer #inner = outer(inner)
def inner() :
print('결과를 출력합니다.')
inner()
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를 함수위에 붙이면 기존에 함수의 변수를 가져온다는
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())
#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>>