TIL #62 : [Python] Decorator (๊ธฐ๋ณธ)๐Ÿงค

์…€๋ ˆ์Šคํ‹ด ํ—ˆยท2021๋…„ 2์›” 9์ผ
1
post-thumbnail

๐Ÿงค ํ•จ์ˆ˜๋กœ ์žฅ์‹ํ•˜์ž!

Decorator๋Š” ์–ธ์ œ ์“ธ๊นŒ?

๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” ํ•จ์ˆ˜๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ์จ๋ณด๊ธฐ


์‹œ๋‚˜๋ฆฌ์˜ค |

๊ณ ๊ฐ ์ƒ๋‹ด ์„ผํ„ฐ ์ง์› ๊น€์• ํ”Œ๋‹˜์€ ํšŒ์‚ฌ ๊ทœ์ •์— ๋”ฐ๋ผ ์ „ํ™”๋ฅผ ๊ฑธ๊ฑฐ๋‚˜ ๋ฐ›์„ ๋•Œ๋งˆ๋‹ค ๋ณธ์ธ ๋ถ€์„œ, ๋ณธ์ธ ์ด๋ฆ„์„ ๋ฐํžŒ ๋‹ค์Œ ๋ณธ๋ก ์œผ๋กœ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.

๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ์—†๋Š” ์ผ๋ฐ˜ ์ฝ”๋“œ

def greeting():
  print('์•ˆ๋…•ํ•˜์„ธ์š” ์ „์ž์„ผํ„ฐ ๊ณ ๊ฐ ์„ผํ„ฐ 1ํŒ€ ์†Œ์† ์ง์› ๊น€์• ํ”Œ์ž…๋‹ˆ๋‹ค.')

  print('๋ฐ•์‚ผ์„ฑ ๊ณ ๊ฐ๋‹˜๊ป˜์„œ <๋…ธํŠธ๋ถ ์ˆ˜๋ฆฌ> ์Šค๋งˆํŠธ ๋‹ค์ด์–ผ ๋ฒˆํ˜ธ๋ฅผ ๋ˆ„๋ฅด์…”์„œ ํ•ด๋‹น ๋ถ€์„œ๋กœ ์—ฐ๊ฒฐ๋์Šต๋‹ˆ๋‹ค. ํ˜น์‹œ ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ์‹ ๊ฐ€์š”?')
  
greeting()

๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ์—†๋Š” ์ผ๋ฐ˜ ์ฝ”๋“œ ์‹คํ–‰ ๊ฒฐ๊ณผ

์•ˆ๋…•ํ•˜์„ธ์š” ์ „์ž์„ผํ„ฐ ๊ณ ๊ฐ ์„ผํ„ฐ 1ํŒ€ ์†Œ์† ์ง์› ๊น€์• ํ”Œ์ž…๋‹ˆ๋‹ค.
๋ฐ•์‚ผ์„ฑ ๊ณ ๊ฐ๋‹˜๊ป˜์„œ <๋…ธํŠธ๋ถ ์ˆ˜๋ฆฌ> ์Šค๋งˆํŠธ ๋‹ค์ด์–ผ ๋ฒˆํ˜ธ๋ฅผ ๋ˆ„๋ฅด์…”์„œ ํ•ด๋‹น ๋ถ€์„œ๋กœ ์—ฐ๊ฒฐ๋์Šต๋‹ˆ๋‹ค. ํ˜น์‹œ ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ์‹ ๊ฐ€์š”?

๋ฌธ์ œ์ : ๋ฐ•์‚ผ์„ฑ๋‹˜์˜ ์ „ํ™”๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ๊ณ ๊ฐ์˜ ์ „ํ™”, ๋˜๋Š” ํšŒ์‚ฌ ๋™๋ฃŒํ•œํ…Œ ๋ฌด์—‡์„ ์งˆ๋ฌธํ•  ๋•Œ๋„ '์•ˆ๋…•ํ•˜์„ธ์š” ~ ์†Œ์† ~ ๊น€์• ํ”Œ์ž…๋‹ˆ๋‹ค.' ์ธ์‚ฌ๋ฅผ ๋ฐ˜๋ณตํ•ด์•ผ ํ•œ๋‹ค. ์ธ์‚ฌ๋ฅผ ๋งค๋ฒˆ ํ•˜๊ธฐ๋„ ๊ท€์ฐฎ๊ณ ! ์‚ฌ๋žŒ์€ ์‹ค์ˆ˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์žŠ์–ด๋ฒ„๋ฆฌ๊ณ  ์•ˆํ•  ์ˆ˜๋„ ์žˆ๋‹ค! ๊ฐ„๋‹จํ•œ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋กœ ๊น€์• ํ”Œ๋‹˜์„ ๋„์™€๋“œ๋ฆด ์ˆ˜ ์žˆ๋‹ค.

๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ์ถ”๊ฐ€ํ•œ ์ฝ”๋“œ

def greeting(func):
  def wrapper():
    print('์•ˆ๋…•ํ•˜์„ธ์š” ์ „์ž์„ผํ„ฐ ๊ณ ๊ฐ ์„ผํ„ฐ 1ํŒ€ ์†Œ์† ์ง์› ๊น€์• ํ”Œ์ž…๋‹ˆ๋‹ค.')
    func() # ์ง‘์ค‘์ง‘์ค‘!
  return wrapper

def customer():
  customer_name = '๋ฐ•์‚ผ์„ฑ'
  print(f'{customer_name} ๊ณ ๊ฐ๋‹˜๊ป˜์„œ <๋…ธํŠธ๋ถ ์ˆ˜๋ฆฌ> ์Šค๋งˆํŠธ ๋‹ค์ด์–ผ ๋ฒˆํ˜ธ๋ฅผ ๋ˆ„๋ฅด์…”์„œ ํ•ด๋‹น ๋ถ€์„œ๋กœ ์—ฐ๊ฒฐ๋์Šต๋‹ˆ๋‹ค. ํ˜น์‹œ ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ์‹ ๊ฐ€์š”?')

def question():
  employee_name = 'ํ•„๋ฆฝ์Šค'
  print(f'{employee_name}๋‹˜ ํ˜น์‹œ ์‹œ๊ฐ„ ๊ดœ์ฐฎ์œผ์‹œ๋‹ค๋ฉด ๋ญ ํ•˜๋‚˜ ์—ฌ์ญค๋ด๋„ ๋ ๊นŒ์š”?')

greeting_customer = greeting(customer)
greeting_customer()

greeting_question = greeting(question)
greeting_question()

๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ์ถ”๊ฐ€ํ•œ ์ฝ”๋“œ ์‹คํ–‰ ๊ฒฐ๊ณผ

์•ˆ๋…•ํ•˜์„ธ์š” ์ „์ž์„ผํ„ฐ ๊ณ ๊ฐ ์„ผํ„ฐ 1ํŒ€ ์†Œ์† ์ง์› ๊น€์• ํ”Œ์ž…๋‹ˆ๋‹ค.
๋ฐ•์‚ผ์„ฑ ๊ณ ๊ฐ๋‹˜๊ป˜์„œ <๋…ธํŠธ๋ถ ์ˆ˜๋ฆฌ> ์Šค๋งˆํŠธ ๋‹ค์ด์–ผ ๋ฒˆํ˜ธ๋ฅผ ๋ˆ„๋ฅด์…”์„œ ํ•ด๋‹น ๋ถ€์„œ๋กœ ์—ฐ๊ฒฐ๋์Šต๋‹ˆ๋‹ค. ํ˜น์‹œ ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ์‹ ๊ฐ€์š”?
์•ˆ๋…•ํ•˜์„ธ์š” ์ „์ž์„ผํ„ฐ ๊ณ ๊ฐ ์„ผํ„ฐ 1ํŒ€ ์†Œ์† ์ง์› ๊น€์• ํ”Œ์ž…๋‹ˆ๋‹ค.
ํ•„๋ฆฝ์Šค๋‹˜ ํ˜น์‹œ ์‹œ๊ฐ„ ๊ดœ์ฐฎ์œผ์‹œ๋‹ค๋ฉด ๋ญ ํ•˜๋‚˜ ์—ฌ์ญค๋ด๋„ ๋ ๊นŒ์š”?

๊น€์• ํ”Œ๋‹˜์€ ์ด์ œ ์ธ์‚ฌ์ง€์˜ฅ์—์„œ ๋น ์ ธ ๋‚˜์˜ค์…จ๋‹ค.

๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์˜ ๊ตฌ์กฐ:

  1. trace : ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์ธ trace๋Š” ํ˜ธ์ถœ ํ•จ์ˆ˜๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›๋Š”๋‹ค.
  2. wrapper : trace ํ•จ์ˆ˜ ์•ˆ์—์„œ ํ˜ธ์ถœ ํ•จ์ˆ˜๋ฅผ ๊ฐ์‹ธ๋Š” ํ•จ์ˆ˜๋‹ค.

@ ๊ณจ๋ฑ…์ด ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ


@์„ ์“ฐ๋ฉด ๋” ๊ฐ„ํŽธํ•˜๊ฒŒ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ธฐ๋ณธ ๊ตฌ์กฐ

@decorator
def new_function():
	...

@ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ์ถ”๊ฐ€ํ•œ ์ฝ”๋“œ

def greeting(func):
  def wrapper():
    print('์•ˆ๋…•ํ•˜์„ธ์š” ์ „์ž์„ผํ„ฐ ๊ณ ๊ฐ ์„ผํ„ฐ 1ํŒ€ ์†Œ์† ์ง์› ๊น€์• ํ”Œ์ž…๋‹ˆ๋‹ค.')
    func()
  return wrapper

@greeting
def customer():
  customer_name = '๋ฐ•์‚ผ์„ฑ'
  print(f'{customer_name} ๊ณ ๊ฐ๋‹˜๊ป˜์„œ <๋…ธํŠธ๋ถ ์ˆ˜๋ฆฌ> ์Šค๋งˆํŠธ ๋‹ค์ด์–ผ ๋ฒˆํ˜ธ๋ฅผ ๋ˆ„๋ฅด์…”์„œ ํ•ด๋‹น ๋ถ€์„œ๋กœ ์—ฐ๊ฒฐ๋์Šต๋‹ˆ๋‹ค. ํ˜น์‹œ ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ์‹ ๊ฐ€์š”?')

@greeting
def question():
  employee_name = 'ํ•„๋ฆฝ์Šค'
  print(f'{employee_name}๋‹˜ ํ˜น์‹œ ์‹œ๊ฐ„ ๊ดœ์ฐฎ์œผ์‹œ๋‹ค๋ฉด ๋ญ ํ•˜๋‚˜ ์—ฌ์ญค๋ด๋„ ๋ ๊นŒ์š”?')

customer()
question()

@ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ์ถ”๊ฐ€ํ•œ ์ฝ”๋“œ ์‹คํ–‰ ๊ฒฐ๊ณผ

์•ˆ๋…•ํ•˜์„ธ์š” ์ „์ž์„ผํ„ฐ ๊ณ ๊ฐ ์„ผํ„ฐ 1ํŒ€ ์†Œ์† ์ง์› ๊น€์• ํ”Œ์ž…๋‹ˆ๋‹ค.
๋ฐ•์‚ผ์„ฑ ๊ณ ๊ฐ๋‹˜๊ป˜์„œ <๋…ธํŠธ๋ถ ์ˆ˜๋ฆฌ> ์Šค๋งˆํŠธ ๋‹ค์ด์–ผ ๋ฒˆํ˜ธ๋ฅผ ๋ˆ„๋ฅด์…”์„œ ํ•ด๋‹น ๋ถ€์„œ๋กœ ์—ฐ๊ฒฐ๋์Šต๋‹ˆ๋‹ค. ํ˜น์‹œ ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ์‹ ๊ฐ€์š”?
์•ˆ๋…•ํ•˜์„ธ์š” ์ „์ž์„ผํ„ฐ ๊ณ ๊ฐ ์„ผํ„ฐ 1ํŒ€ ์†Œ์† ์ง์› ๊น€์• ํ”Œ์ž…๋‹ˆ๋‹ค.
ํ•„๋ฆฝ์Šค๋‹˜ ํ˜น์‹œ ์‹œ๊ฐ„ ๊ดœ์ฐฎ์œผ์‹œ๋‹ค๋ฉด ๋ญ ํ•˜๋‚˜ ์—ฌ์ญค๋ด๋„ ๋ ๊นŒ์š”?

์œ„์— trace() ์ผ๋˜ ๋ฐฉ๋ฒ•๊ณผ ๋˜‘๊ฐ™์€ ์‹คํ–‰ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค~~

์ถ”๊ฐ€ | ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ์—ฌ๋Ÿฌ๊ฐœ ์ง€์ •ํ•˜๊ธฐ


์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์˜ ํ•จ์ˆ˜์— ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” ์œ„์—์„œ ์•„๋ž˜๋กœ ์‹คํ–‰๋œ๋‹ค!

์‹œ๋‚˜๋ฆฌ์˜ค | ํŠน๋ณ„ ์ด๋ฒคํŠธ ํ–‰์‚ฌ ๊ธฐ๊ฐ„์ด๋ผ ๊น€์• ํ”Œ๋‹˜์€ ๋ชจ๋“  ์ƒ๋‹ด ๊ณ ๊ฐ๋‹˜๊ป˜ ํ–‰์‚ฌ ์‹œ๊ฐ„์— ๊ด€ํ•œ ์ •๋ณด๋„ ์ถ”๊ฐ€๋กœ ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค.

๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ์—ฌ๋Ÿฌ๊ฐœ ์ถ”๊ฐ€ํ•œ ์ฝ”๋“œ

def special_event(func):
  def wrapper():
    print('์ง€๊ธˆ ํŠน๋ณ„ ์ด๋ฒคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒ๋‹ด ์ „ํ™” ํ›„ ์ „์ž์„ผํ„ฐ ํ™ˆํŽ˜์ด์ง€๋ฅผ ๋ฐฉ๋ฌธํ•˜์‹œ๋ฉด ๋” ์ž์„ธํ•œ ์ •๋ณด๋ฅผ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.')
    func()
  return wrapper

def greeting(func):
  def wrapper():
    print('์•ˆ๋…•ํ•˜์„ธ์š” ์ „์ž์„ผํ„ฐ ๊ณ ๊ฐ ์„ผํ„ฐ 1ํŒ€ ์†Œ์† ์ง์› ๊น€์• ํ”Œ์ž…๋‹ˆ๋‹ค.')
    func()
  return wrapper

@greeting
@special_event
def customer():
  customer_name = '๋ฐ•์‚ผ์„ฑ'
  print(f'{customer_name} ๊ณ ๊ฐ๋‹˜๊ป˜์„œ <๋…ธํŠธ๋ถ ์ˆ˜๋ฆฌ> ์Šค๋งˆํŠธ ๋‹ค์ด์–ผ ๋ฒˆํ˜ธ๋ฅผ ๋ˆ„๋ฅด์…”์„œ ํ•ด๋‹น ๋ถ€์„œ๋กœ ์—ฐ๊ฒฐ๋์Šต๋‹ˆ๋‹ค. ํ˜น์‹œ ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ์‹ ๊ฐ€์š”?')

customer()

๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ์—ฌ๋Ÿฌ๊ฐœ ์ถ”๊ฐ€ํ•œ ์ฝ”๋“œ ์‹คํ–‰ ๊ฒฐ๊ณผ

์•ˆ๋…•ํ•˜์„ธ์š” ์ „์ž์„ผํ„ฐ ๊ณ ๊ฐ ์„ผํ„ฐ 1ํŒ€ ์†Œ์† ์ง์› ๊น€์• ํ”Œ์ž…๋‹ˆ๋‹ค.
์ง€๊ธˆ ํŠน๋ณ„ ์ด๋ฒคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒ๋‹ด ์ „ํ™” ํ›„ ์ „์ž์„ผํ„ฐ ํ™ˆํŽ˜์ด์ง€๋ฅผ ๋ฐฉ๋ฌธํ•˜์‹œ๋ฉด ๋” ์ž์„ธํ•œ ์ •๋ณด๋ฅผ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฐ•์‚ผ์„ฑ ๊ณ ๊ฐ๋‹˜๊ป˜์„œ <๋…ธํŠธ๋ถ ์ˆ˜๋ฆฌ> ์Šค๋งˆํŠธ ๋‹ค์ด์–ผ ๋ฒˆํ˜ธ๋ฅผ ๋ˆ„๋ฅด์…”์„œ ํ•ด๋‹น ๋ถ€์„œ๋กœ ์—ฐ๊ฒฐ๋์Šต๋‹ˆ๋‹ค. ํ˜น์‹œ ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ์‹ ๊ฐ€์š”?

์ด๋ฒคํŠธ์— ๊ด€ํ•œ ์‚ฌํ•ญ๋„ @special_event ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•ด ์„ฑ๊ณต์ ์œผ๋กœ ์ „๋‹ฌํ–ˆ๋‹ค!

Reference:
https://medium.com/@hckcksrl/python-%EB%8D%B0%EC%BD%94%EB%A0%88%EC%9D%B4%ED%84%B0-decorator-980fe8ca5276
https://dojang.io/mod/page/view.php?id=2427

profile
Software Developer / ๊ณ ํ†ต์€ ํ•„์—ฐ, ๊ดด๋กœ์›€์€ ์„ ํƒ

1๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2021๋…„ 2์›” 14์ผ

๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ๋„ˆ๋ฌด ์–ด๋ ค์›Œ์š”...ใ… ใ…  ์นœ์ ˆํ•œ ์„ค๋ช… ํ•˜๋‚˜ํ•˜๋‚˜ ๋œฏ์–ด๋ณด๊ณ  ๊ฐ‘๋‹ˆ๋‹น!!

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ