* ์ด ๊ธ์ ๋ค์ด๋ฒ ๋ถ์คํธ ์ฝ์ค์ ์ธ๊ณต์ง๋ฅ(AI) ๊ธฐ์ด ๋ค์ง๊ธฐ ๊ฐ์๋ฅผ ์๊ฐํ๋ฉฐ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.
Decorator๋ ํด๋น ๊ฐ์๋ง์ผ๋ก๋ ์ดํด๊ฐ ์ด๋ ค์ ๋ค์ ์ฐพ์์ ์ ๋ฆฌํ์์
ํด๋์ค์ ๊ฐ์ฒด
์ ์ฐจ์งํฅ vs ๊ฐ์ฒด์งํฅ
์ ์ฐจ์งํฅ : ์๊ฐ์ ์ฒญ์ ์์๋ถํฐ ๋๊น์ง ์์๋๋ก ์ ์ฅ
๊ฐ์ฒด์งํฅ : ์๊ฐ์ ์ฒญ ๊ด๋ จ ์ฃผ์ฒด๋ค์ ํ๋๊ณผ ๋ฐ์ดํฐ ๋ค์ ์ค์ฌ์ผ๋ก ํ๋ก๊ทธ๋จ ์์ฑ
๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ Object-Oriented Programming
- ํด๋์ค์ ์ธ์คํด์ค(=๊ฐ์ฒด)
๋ถ์ด๋นตํ ๋ถ์ด๋นต
- ๊ฐ์ฒด : ์์ฑ(Attribute)์ ํ๋(Action)์ ๊ฐ์ง
๋ณ์(variable) ํจ์(method)
์ฝ๋๋ก ์ดํด๋ณด๊ธฐ
class SoccerPlayer(object):
์์๋ฐ๋ ๊ฐ์ฒด๋ช
def __init__(self, name : ์๋ฃํ, position : ์๋ฃํ, back_number : ์๋ฃํ): ##__init__์ ๊ฐ์ฒด ์ด๊ธฐํ ์์ฝ ํจ์
์์ฑ๋ ์ธ์คํด์ค
self.name = name
self.position = position
self.back_number = back_number
a = SoccerPlayer("sarah", "left", 10)
b = SoccerPlayer("nick", "right", 20)
--- ----------------- -----------------------
๊ฐ์ฒด ํด๋์ค __init__ ํจ์ ์ธํฐํ์ด์ค, ์ด๊ธฐ๊ฐ
์ฐธ๊ณ .
โ __init__์ ๊ฐ์ฒด ์ด๊ธฐํ ์์ฝํจ์
__์ ํน์ํ ์์ฝํจ์๋ ๋ณ์ ๊ทธ๋ฆฌ๊ณ ํจ์๋ช ๋ณ๊ฒฝ(๋งจ๊ธ๋ง)์ผ๋ก ์ฌ์ฉ
ex. __main__ __add__ __str__ __eq__
๊ฐ์ฒด+๊ฐ์ฒด print(๊ฐ์ฒด)
โ ํ์ด์ฌ ์ด๋ฆ ๊ท์น
ํด๋์ค๋ช vs ํจ์๋ช ๊ณผ ๋ณ์๋ช
๋์ด์ฐ๊ธฐ ๋ถ๋ถ ๋๋ฌธ์ _
ex. ExpensiveCar gasoline_engine
์ฃผ์๊ฐ๋
1. Inheritance ์์
๋ถ๋ชจํด๋์ค์ ์์ฑ์ ์์ํด๋์ค๊ฐ ์์๋ฐ๋๊ฒ
์์ํด๋์ค์ ํจ์๋ super()์ ์ด์ฉํด์ ์์ํ๊ฑฐ๋ ์ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์์
class ๋ถ๋ชจ(Object):
......
class ์์(๋ถ๋ชจ):
def __init__(self, name, age, gender, salary, hire_date):
super().__init__(name, age, gender)
self.salary=salary
self.hire_date=hire_date
cf) ์ค๋ฒ๋ผ์ด๋ฉ(Overriding) : ๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋ ์ผ๋ถ๋ฅผ ์์ ํด๋์ค์์ ๋ณ๊ฒฝํ๋๊ฒ. ์ค๋ฒ๋ผ์ด๋ฉ ํ์ง ์์ ๋ค๋ฅธ ๋ฉ์๋๋ ๊ทธ๋๋ก ์์๋จ
2. Polymorphism ๋คํ์ฑ
๊ฐ์ ์ด๋ฆ ๋ฉ์๋์ ๋ด๋ถ ๋ก์ง์ ๋ค๋ฅด๊ฒ ์์ฑํ๋๊ฒ
- ์ฃผ๋ก ๋ถ๋ชจํด๋์ค์์ ์ถ์ ๋ฉ์๋๋ฅผ ๋ง๋ค๊ณ ->์์์์ ์์์ ํจ์ ์ด๋ฆ์ ๋์ผ but ์์ธ ๊ตฌํ๋ง ๋ค๋ฆ
cf) ์ค๋ฒ๋ก๋ฉ(Overloading) : ๋์ผํ ์ด๋ฆ์ ํจ์๋ฅผ ๋งค๊ฐ๋ณ์์ ๋ฐ๋ผ ๋ค๋ฅธ ๊ธฐ๋ฅ์ผ๋ก ๋์ํ๊ฒ ํ๋๊ฒ
ํ์ด์ฌ์์ ์ ์์ผ๋ก ์ง์ํ๋ ๊ฐ๋
์ ์๋
์ค๋ฒ๋ผ์ด๋ฉ๊ณผ ์ค๋ฒ๋ก๋ฉ์ ๊ฒฝ์ฐ ์ด๋ฆ๋ ๋น์ทํ๊ณ , ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์์์ ์ฃผ์ ๊ฐ๋ ์ด๋ผ ํท๊ฐ๋ฆฌ์ง ์๋๊ฒ์ด ์ค์
์ธ์ฐ๊ธฐํ.
ํจ์ ์ด๋ฆ ํ๋๋น ๋งค๊ฐ๋ณ์์ ๋ฐ๋ผ ์ด๋ค ํจ์๋ฅผ ๋ถ๋ฌ์์ผ ํ ์ง ์ ํํด์ผ ํ๋๊น loading ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆผ -> ์ค๋ฒ๋ก๋ฉ!
3. Visibility
๊ฐ์ฒด์ ์ ๋ณด๋ฅผ ๋ณผ ์ ์๋ ๋ ๋ฒจ์ ์กฐ์ ํ๋๊ฒ(๋ณด์)
- ์บก์ํ ๋๋ ์ ๋ณด ์๋์ด๋ผ๊ณ ํจ -> ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉ
__๋ณ์๋ช : private ๋ณ์๋ก ์ ์ธํ๋๊ฒ์ผ๋ก ํ ๊ฐ์ฒด๊ฐ ์ ๊ทผํ์ง ๋ชปํจ
- private ๋ณ์์ ์ ๊ทผํ๋ ๋ช๊ฐ์ง ๋ฐฉ๋ฒ
- @property : property decorator๋ก ์จ๊ฒจ์ง ๋ณ์๋ฅผ ๋ฐํ
์์ ) ์์ฑ์์ ์ธ์คํด์ค๊ฐ private์ธ Carํด๋์ค๋ฅผ ๊ตฌํํ์ฌ๋ผ.
๋จ, ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ด์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํด์ผํ๋ฉฐ ์ฐจ์ ์์ข์์ ๋ช๊ฐ์ ๋ฌธ์ด ์ด๋ ค์๋์ง ์ถ๋ ฅํ๋ ๋ก์ง์ ํด๋์ค ๋ฐ์ ๊ตฌํํ์ฌ์ผ ํ๋ค.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | class Car(): def __init__(self, frontleft, frontright): self.__frontleft = frontleft self.__frontright = frontright ##Decorator์ธ property๋ฅผ ์ด์ฉํ์ฌ private ๋ฐ์ดํฐ์ ใ
ใ
๊ทผ @ property def frontleft(self): return self.__frontleft @ property def frontright(self): return self.__frontright #Car ํด๋์ค ๊ฐ์ฒด ์ ์ธ car = Car(True, False) # ์ฐจ์ ์ด๋ฆฐ๋ฌธ ๊ฐ์๋ฅผ ์ธ๋ ํจ์ def frontdoor_open_num(leftdoor, rightdoor): if leftdoor & rightdoor == True: return 2 elif leftdoor | rightdoor == True: return 1 else: return 0 print(frontdoor_open_num(car.frontleft, car.frontright)) | cs |
cf) Decorator ๋?
- First-class objects
- ์ผ๋ฑํจ์ ๋๋ ์ผ๊ธ ๊ฐ์ฒด
- ๋ณ์๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ํ ๋น์ด ๊ฐ๋ฅํ ๊ฐ์ฒด
- ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ or ๋ฆฌํด๊ฐ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅ
ํ์ด์ฌ์ ๋ชจ๋ ํจ์๋ ์ผ๊ธํจ์์ด๋ค." => ํจ์์์ฒด๋ฅผ ํ๋ผ๋ฏธํฐ์ ๋ฆฌํด๊ฐ์ผ๋ก ์ฌ์ฉํ ์ ์์
- ์ฌ์ฉ ๋ชฉ์ : ํจ์๋ฅผ ์์ ํ์ง ์์ ์ํ์์ ์ถ๊ฐ ๊ธฐ๋ฅ์ ๊ตฌํ => ํจ์๋ง๋ค ๋ฐ๋ณต๋๋ ์ผ์ ํ ๋
์์ ) ํจ์๋ฅผ ์์ํ๊ณ ๋๋ผ๋ ํจ์์ด๋ฆ+ํจ์์์, ํจ์์ด๋ฆ+ํจ์ ๋์ ์ถ๋ ฅํด ๋ณด์.
hi ํจ์ ์์
hi
hi ํจ์ ๋
bye ํจ์ ์์
bye
bye ํจ์ ๋
๊ตฌํ1) ํจ์ ์์์ ํ๋์ฉ ๊ตฌํ
1 2 3 4 5 6 7 8 | def hi(): print("hi ํจ์ ์์") print("hi") print("hi ํจ์ ๋") def bye(): print("bye ํจ์ ์์") print("bye") print("bye ํจ์ ๋") | cs |
๋ชจ๋ ํจ์๋ง๋ค print๋ฌธ์ ์ ๋ ฅํด์ผ ํ๋ฏ๋ก ๋ฒ๊ฑฐ๋กญ๋ค.
๊ตฌํ2) ํจ์๋ก ๊ตฌํ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | def trace(func): #ํธ์ถํ ํจ์๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฐ๋ ํจ์ def wrapper(): print(func.__name__, 'ํจ์ ์์') func() print(func.__name__, 'ํจ์ ๋') return wrapper def hi(): print("hi") def bye(): print("bye") trace_hi=trace(hi) #๋งค๊ฐ๋ณ์๋ก ํจ์ ์ ๋ฌ trace_hi() #๋ฐํ๋ ํจ์ ํธ์ถ trace_bye=trace(bye) #๋งค๊ฐ๋ณ์๋ก ํจ์ ์ ๋ฌ trace_bye() #๋ฐํ๋ ํจ์ ํธ์ถ | cs |
๊ตฌํ3) decorator๋ก ๊ตฌํ - @ ์ฌ์ฉ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | def trace(func): #decorator : ํธ์ถํ ํจ์๋ฅผ ๋งค๊ฐ๋ณ์๋ก def wrapper(): print(func.__name__, 'ํจ์ ์์') func() print(func.__name__, 'ํจ์ ๋') return wrapper @trace #decorator def hi(): print("hi") @trace #decorator def bye(): print("bye") hi() bye() | cs |