νμ΄μ¬ λ©μλ μ€λ²λΌμ΄λ©, μ€λ²λ‘λ©
2021. 5. 18. 02:50γBackend/π Python
λ©μλ μ€λ²λΌμ΄λ©
- μ€λ²λΌμ΄λ©μ λΆλͺ¨ ν΄λμ€μ λ©μλλ₯Ό, μμ ν΄λμ€μμ μ¬μ μ νμ¬ μ¬μ©νλ κ²μ μλ―Ένλ€.
- μλ₯Ό λ€μ΄ λΆλͺ¨ν΄λμ€μμ add()λΌλ λ©μλλ 2κ°μ μΈμλ°μ λν μ μμ§λ§, μμ ν΄λμ€μ add() λ©μλλ μ€λ²λΌμ΄λ©λμ΄ 3κ°μ§μ μΈμκΉμ§ λ°λλ‘ μ¬μ μ ν μ μλ€.
- μλΈν΄λμ€(μμ)μμ μνΌ(λΆλͺ¨)ν΄λμ€λ₯Ό νΈμΆ ν μ¬μ©
- λ©μλ μ¬ μ μ ν μ¬μ©κ°λ₯
- λΆλͺ¨ν΄λμ€μ λ©μλλ₯Ό μΆμν ν μ¬μ©κ°λ₯ (ꡬ쑰μ μ κ·Ό κ°λ₯)
- νμ₯ κ°λ₯ + λ€νμ±(λ€μν λ°©μμΌλ‘ λμ -> λΆλͺ¨μμ λ©μλ νλλ₯Ό λ§λ€μ§λ§,μ¬μ©νλ μμμ λ°λΌ λ€μνκ² μ¬μ©λ μ μλ€)
- κ°λ μ± μ¦κ°, μ€λ₯κ°λ₯μ± κ°μ, λ©μλ μ΄λ¦ μ μ½(λΆλͺ¨κ° λ©μλ μ΄λ¦μ μ΄λ―Έ μ μν΄λ¨κΈ°μ)
dir(),_dict_ κ°μ²΄ λ΄λΆ κ²μ¬ λ©μλ
- dir() : ν΄λμ€μ μΈμ€ν΄μ€ λ΄λΆμμ μ¬μ©ν μ μλ μ 보λ₯Ό νμΈ
- _dict_ : μΈμ€ν΄μ€ λ΄λΆμ μ΄λ€ μμ±μ΄ μλμ§ νμΈ
- μμ ν΄λμ€κ° λΆλͺ¨ν΄λμ€λ₯Ό μμλ°λλ€ νλλΌλ, μΈμ€ν΄μ€ν λκΈ° μ μ _dict_ μ κ²°κ³Όκ° λ€λ₯΄λ€. (μΈμ€ν΄μ€ν μμ μ λ΄λΆ μμ±κΉμ§ μμ)
- λ΄μ©μ΄ μ΄λ €μ°λ μ½λλ‘ νμΈν΄λ³΄μ
# κΈ°λ³Έ Overriding μμ
class ParentEx1():
def __init__(self):
self.value = 5
def get_value(self):
return self.value
class ChildEx1(ParentEx1): # ParentEx1 μμ κ°±
# μ€λ²λΌμ΄λ©(μ¬μ μ)νμ§ μμλ€.
pass
# ChildEx1()λ c1 λ³μμκ² ν λΉνκΈ° μ κΉμ§, μΈμ€ν΄μ€νλ κ² μλλ€.
c1 = ChildEx1()
# ParentEx1()λ λ§μ°¬κ°μ§
p1 = ParentEx1()
print('Ex 1 >', c1.get_value())
>>> 5
# λ©μλ μ¬μ μ(μ€λ²λΌμ΄λ©)κ° μμκΈ° λλ¬Έμ λΆλͺ¨ν΄λμ€μμ μ§μ ν κ°μ κ·Έλλ‘ μΆλ ₯
# c1μ λͺ¨λ μμ± μΆλ ₯
print(dir(c1)) # get_value, valueλ₯Ό κ°μ§κ³ μλ€.
# λΆλͺ¨ & μμμ λͺ¨λ μμ±κ° μΆλ ₯
print('Ex 1 > ', dir(ParentEx1))
print('Ex 1 > ', dir(ChildEx1))
# λ©μλκ° κ°λ€ -> λΆλͺ¨ ν΄λμ€μ get_value() λ©μλλ₯Ό μμλ°λλ€.
print('Ex 1 >', ParentEx1.__dict__)
print('Ex 1 >', ChildEx1.__dict__)
- λμ λλ¦¬λ‘ λ€μμ€νμ΄μ€λ΄μ μμ±λ€μ νμΈνλλ°, λΆλͺ¨μκ²λ μμ§λ§, μμμκ²λ μλ€.
- μΈμ€ν΄μ€κ° λλ μμ μ μμμκ² λ΄κΈ°λ κ²μ΄λ€(c1=ChildEx1 μ΄λ κ² ν λΉνλ κ²μ΄ μΈμ€ν΄μ€ν μμ , κ·Έλ κΈ° λλ¬Έμ dir()κ³Ό __dict__λ‘ μ°μλ λ€λ₯΄κ² λμ¨λ€.
λ©μλ μ€λ²λΌμ΄λ© μμ
- μλ μμ μμ λ©μλ μ€λ²λΌμ΄λ©μ΄ μΌμ΄λ, get_valueλΌλ λ©μλμμ κΈ°μ‘΄ self.valueμ 10μ κ³±νμ¬ λ¦¬ν΄νκ² λλ€.
class ParentEx2():
def __init__(self):
self.value = 5
def get_value(self):
return self.value
class ChildEx2(ParentEx2):
def get_value(self): # λ©μλ λ³κ²½ => λ©μλ μ€λ²λΌμ΄λ©
return self.value * 10
c2 = ChildEx2()
print("Ex 2 >", c2.get_value())
# Ex1 κ³Ό λ¬λ¦¬ Ex2μμ λ©μλ μ€λ²λΌμ΄λ©μ΄ μΌμ΄λ¬κΈ° λλ¬Έμ, 5κ° μλ 50μ΄ μΆλ ₯λλ€.
λ©μλ μ€λ²λΌμ΄λ© λ€νμ± μμ
import datetime
# λΆλͺ¨ ν΄λμ€
class Logger():
def log(self, msg):
print(msg)
# Loggerμ TimestampLoggerλΌλ μμ (μμ1)
class TimestampLogger(Logger):
def log(self, msg):
message = '{ts} {msg}'.format(ts=datetime.datetime.now(), msg=msg)
super().log(message) # λΆλͺ¨ν΄λμ€μ log() λ©μλλ‘ messageμΈμλ₯Ό λ겨λ²μ
# super(TimestampLogger, self).log(message) # μ μ½λμ λ€λ₯Ό λ° μμ§λ§ λ λͺ
ννλ€, # fm style λ‘ μ½λ©ν κ²
# Loggerμ DateLoggerλΌλ μμ (μμ2) ==> μ¬λ¬ μμ μκΉ : λ€νμ±
class DateLogger(Logger):
def log(self, msg):
message = "{ts} {msg}".format(ts=datetime.datetime.now().strftime('%Y-%m-%d'), msg=msg)
super().log(message)
λ€νμ±
νλμ λΆλͺ¨(Logger ν΄λμ€)λ₯Ό μ νκ³ ,
λ€μν νν(TimestampLogger, DateLogger ν΄λμ€)λ‘ μμμ λ°λλ€.
# λΌλλ λΆλͺ¨κ° μ 곡 <μΆλ ₯ κΈ°λ₯ print(msg)> => μΆλ ₯ν λ©μΈμ§μ ννλ μμμ΄ κ²°μ
l = Logger()
t = TimestampLogger()
d = DateLogger()
# μΈμ€ν΄μ€ μμ±λλ©΄μ, λΆλͺ¨ν΄λμ€μ μμ± μμ μλ£
l.log('test1')
t.log('test2')
d.log('test3')
>>> test1
>>> 2021-04-06 21:12:30.730855 test2
>>> 2021-04-06 test3
λΆλͺ νλμ λΆλͺ¨ν΄λμ€μμ log() λ©μλλ₯Ό μμλ°μμ§λ§, μμ ν΄λμ€μμ λ€μν ννλ‘ μΆλ ₯λ¨μ νμΈ ν μ μλ€. μ΄λ λ― λ©μλ μ€λ²λΌμ΄λ©μ ν΅ν΄ λ€νμ± κ΅¬νμ΄ κ°λ₯νλ€.
νμ΄μ¬ λ©μλ μ€λ²λ‘λ©
- λμΌ ν΄λμ€ λ΄μμ, 맀κ°λ³μμ κ°μ λλ μλ£ν(int, float λ±)μ΄ λ€λ₯Έ λλͺ
μ λ©μλλ₯Ό μ μνλ κ².
μ¦, ν΄λμ€ λ΄μμ κ°μ μ΄λ¦μ λ©μλλ₯Ό μ¬λ¬ κ° μ μΈνλ κ²μ μλ―Ένλ€. - Q. μ μ΄λ° κ²μ λ§λλλ?.!
- A. λ€μν 맀κ°λ³μλ₯Ό λ°μ μ²λ¦¬ν μ μλλ‘ νκΈ° μν¨μ΄λ€.
ex) λνκΈ° λ©μλλ₯Ό λ§λ€ λ, λκ°μ 맀κ°λ³μλ§ λ°λ λ©μλμ, μΈκ°μ 맀κ°λ³μ, νΉμ κ·Έ μ΄μ κ°μμ 맀κ°λ³μλ₯Ό λ°μ μ μλ λνκΈ° λ©μλλ₯Ό λ§λ€ μ μλ€ (λμΌν λ©μλ μ΄λ¦μΌλ‘)
Ex 1
- λμΌ μ΄λ¦ λ©μλ μ¬μ© μμ
- λμ νμ κ²μ¬ -> μ€ν μ νμ κ²μ¬(νμ μλ¬κ° μ€νμμ λ°κ²¬) -> κΈ°μ λ©΄μ μμ λ§μ΄ λ¬Όμ΄λ³Έλ€.
class SampleA():
def add(self, x, y):
return x + y
def add(self, x, y, z):
return x + y + z
# def add(self, *args): # μΈμλ₯Ό μΈν©νΉνμ¬ μΈμκ° λͺκ°λ μκ΄μμ΄ μ¬μ©ν μ μλ€.
# return sum(args)
a = SampleA()
μ΄λ κ² λμΌ λ€μ΄λ°μΌλ‘ μλ‘ λ€λ₯Έ κ°μμ 맀κ°λ³μλ₯Ό λ°μ§λ§, μλμμ 보면 (Javaμ λ¬λ¦¬) λ°λ‘ μλ¬ ν°μ§λ€.
print('Ex 1 > ', a.add(2, 3))
>>> TypeError: add() missing 1 required positional argument: 'z'
# λ°λ‘ μλ¬ν°μ§λ€ => λμΌ λ©μλλͺ
μ΄κΈ°μ, μΈμκ° μΈκ°λ₯Ό λ°λ add()κ° νΈμΆλλ€.
- νμ΄μ¬μμλ λ©μλ μ€λ²λ‘λ©μ μ§μνμ§ μκΈ° λλ¬Έμ λ°μνλ μλ¬
- μλ°μμλ μ€λ²λ‘λ© κ°λ₯νκΈ° λλ¬Έμ, λμΌν λ€μμ΄λ©΄μ μ¬λ¬κ° λ§λ€μ΄ μλ‘ λ€λ₯Έ μΈμ κ°―μλ₯Ό λ°λ λ©μλλ₯Ό λ§λ€ μ μλ€.
Ex 2
- λμΌ μ΄λ¦ λ©μλ μ¬μ© μμ
- μλ£νμ λ°λ₯Έ λΆκΈ° μ²λ¦¬
class SampleB():
def add(self, datatype, *args):
if datatype == 'int':
return sum(args)
if datatype == 'str':
return ''.join([x for x in args])
b = SampleB()
# Number
print('Ex 2 > ', b.add('int', 5, 6, 3))
print('Ex 2 > ', b.add('str', 'Hello', 'World'))
Ex3
- MultipleDispatch ν¨ν€μ§λ₯Ό ν΅ν λ©μλ μ€λ²λ‘λ© β‘οΈ pip install multipledispatch β‘οΈ λ©μλμ @dispatch μ΄λ Έν μ΄μ μ λΆμ¬ μ μ© β‘οΈ μ΄μ μλ°μμ μ²λΌ μ€λ²λ‘λ© κ°λ₯
from multipledispatch import dispatch
class SampleC():
@dispatch(int, int)
def product(self, x, y):
return x * y
@dispatch(int, int, int)
def product(self, x, y, z):
return x * y * z
@dispatch(float, float, float)
def product(self, x, y, z):
return x * y * z
c = SampleC()
# νλΌλ―Έν° 2κ°
print("Ex 3 > ", c.product(3, 4))
>>> Ex 3 > 12
# νλΌλ―Έν° 3κ°
print("Ex 3 > ", c.product(3, 4, 5))
>>> Ex 3 > 60
# νλΌλ―Έν° 3κ° μλ£ν float
print("Ex 3 > ", c.product(3.5, 4.0, 1.2))
>>> Ex 3 > 16.8
- κ° μν©μ λ§κ² dispatch, μ€λ²λ‘λ©λμ΄ λ©μλ νΈμΆ
- Ex2μ λ€λ₯΄κ² μΌμΌμ΄ λ°μ΄ν° νμ μ λͺ μν νμμμ΄, @dispatch μ΄λ Έν μ΄μ λλΆμ μλμΌλ‘ μ²λ¦¬λλ€.
- λ°μ΄ν° νμ μ κ΄μ μμ λ©μλλ₯Ό μμ±νμ¬ κ΅¬μ‘°μ± μλ ν΄λμ€ μμ±
'Backend > π Python' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Django CBV (1) - νμκ°μ (0) | 2021.05.23 |
---|---|
Django Bootstrap4 μ°λ (0) | 2021.05.23 |
νμ΄μ¬ lambda, filter, reduce (0) | 2021.05.18 |
νμ΄μ¬ κΉμ 볡μ¬, μμ λ³΅μ¬ (shallow copy, deep copy) (0) | 2021.05.18 |
μΈνλ° λ¦¬ν2κΈ° OT (0) | 2021.03.10 |