π[Python] λ§€μ§ λ©μλ - 1
on
λ€μ΄κ°λ©°
μ°λ¦¬κ° μ½λλ₯Ό μμ±ν λ, νμ΄μ¬μ΄ λ΄λΆμ μΌλ‘ Built-in ν¨μλ₯Ό μμ ν΄μ μ¬μ©νμ¬ λλ©΄ μ’ λ ν¨μ¨μ μ΄ μ½λ©μ΄ κ°λ₯ ν©λλ€. μ΄κ²μ λ§€μ§ λ©μλ νΉμ μ€νμ λ©μλλΌκ³ ν©λλ€.
νμ΄μ¬μ μνκΈ° μν΄μλ μνμ€(Sequence), λ°λ³΅(Iterator), ν¨μ(Functions), ν΄λμ€(Class) μ΄ 4κ°μ§ μμλ₯Ό μ μμμΌ ν©λλ€.
λ§€μ§ λ©μλ
ν΄λμ€ μμ μ μν μ μλ νΉλ³ν(Built-in) λ©μλλ₯Ό λ§€μ§ λ©μλλΌκ³ ν©λλ€.
κΈ°λ³Έν
λ€μκ³Ό κ°μ΄ int
λ©μλλ₯Ό μΆλ ₯νλ©΄ μ΄λ»κ² λ κΉμ? λ€μκ³Ό κ°μ΄ <class 'int'>
λ‘ μΆλ ₯ λ©λλ€. λ€μ λ§ν΄ νμ΄μ¬μ λͺ¨λ λ°μ΄ν° νμ
μ ν΄λμ€ μ
λλ€. κ·Έλμ ν΄λμ€κ° μ€μν κ² μ
λλ€.
print(int)
# <class 'int'>
λͺ¨λ μμ± λ° λ©μλ μΆλ ₯
κ·Έλ λ€λ©΄ int
ν΄λμ€μλ μ΄λ€ μμ±λ€μ΄ λ΄κ²¨μ Έ μμκΉμ?
print(dir(int))
# ['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'as_integer_ratio', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
μ°λ¦¬κ° μ΄μ μ μ¬μ©νλ λ³μλ€ λ³΄λ€λ ν¨μ¬ λ λ§μ λ©μλλ€μ ν¬ν¨νκ³ μμ΅λλ€. λ€μκ³Ό κ°μ΄ n
μ int
ν μ«μλ₯Ό μ μΈ νκ³ type
μ μ°μ΄λ³΄λ©΄ λ€μκ³Ό κ°μ΄ int class
λ₯Ό μΆλ ₯ν©λλ€. μ¦, int class
μ λ©μλλ€μ μμ νλ©΄ λ³΄λ€ low-levelμμ μ½λ©μ΄ κ°λ₯ν΄ μ§λλ€.
n = 10
print(type(n))
# <class 'int'>
λ€μ μ½λ©κ³Ό κ°μ΄ +
λ₯Ό μ¬μ©ν건, __add__
λ©μλλ₯Ό μ¬μ©ν건 κ²°κ³Όκ° λμΌ ν©λλ€. μ°λ¦¬κ° λ§μ
μ ν λ +
μ΄ μλλΌ __add__
λ₯Ό μ¬μ©νλ©΄ μ΄λ¨κΉμ? κ΅μ₯ν μ¬μ©νκΈ° μ΄λ ΅κ³ κ°λ
μ±λ λ¨μ΄ μ§ κ² μ
λλ€. λλ¬Έμ νμ΄μ¬ μΈμ΄μμ μ΄λ₯Ό wrapping μ²λ¦¬λ₯Ό νμ¬ +
μΌλ‘ μ°μ°μ΄ κ°λ₯νλλ‘ ν κ² μ
λλ€.
>>> n = 10
>>> print(n+ 100)
>>> print(n.__add__(100))
# 110
# 110
μμ #1
λ€μκ³Ό κ°μ΄ ν΄λμ€ μ½λλ₯Ό μμ±νλ€.
# ν΄λμ€ μμ 1
class Fruit:
def __init__(self, name, price) -> None:
self._name = name
self._price = price
def __str__(self) -> str:
return f'Fruit Class Info {self._name}, {self._price}'
def __add__(self, x):
return self._price + x._price
λ€μκ³Ό κ°μ΄ μΈμ€ν΄μ€λ₯Ό μμ±νλ€.
# μΈμ€ν΄μ€ μ¬μ©
s1 = Fruit("Orange", 7500)
s2 = Fruit('Banana', 3000)
μ μ΄ λμ κ³ΌμΌ κ°κ²©μ κ³μ°νλ©΄ μ΄λ»κ² ν΄μΌ ν κΉ? μΈμ€ν΄μ€λ₯Ό μ§μ μ μν΄μ μ°μ°νλ κ²μ λ§€μ° μνν νλμ΄λΌκ³ νλ€. λν μ½λμ μλ λμ΄ λκ³ κ°λ
μ±λ λ¨μ΄μ§κ² λλ€.
# μΌλ°μ μΈ μ°μ°
s1._price + s2._price
# λ§€μ§ λ©μλλ₯Ό μ¬μ©ν μ°μ°
s1 + s2
μμ κ°μ΄ λ§€μ§ λ©μλλ₯Ό μ¬μ©νλ©΄ μΈμ€ν΄μ€ λ³μλ λ³΄νΈ ν μ μμ λΏλ§ μλλΌ μ½λμ κ°λ μ±λ μ΄μλκ² λλ€.
μμ #2
μλ₯Ό λ€μ΄, 2μ°¨μ νλ©΄μμ μ’νλ₯Ό λ§μ νλ λ¬Έμ κ° μ£Όμ΄μ‘λ€κ³ κ°μ ν΄λ³΄μ.
(5,2) + (4,3) = (9,5)
(10,3) + * 5 = (50, 15)
max((5,10)) = 10
ν΄λμ€ κ΅¬ν
class Vector(object):
''''''
def __init__(self, *args) -> None:
"""Create a vector, example : v = Vector(5,10)"""
if len(args) == 0:
self._x, self._y = 0, 0
else:
self._x, self._y = args
def __repr__(self) -> str:
"Return the Vector information"
return f"Vector({self._x}, {self._y})"
def __add__(self, other):
"""Return the vector addition of inputs"""
return Vector(self._x + other._x, self._y + other._y)
def __mul__(self, other):
"""Return the vector multiply of inputs"""
return Vector(self._x * other._x, self._y * other._y)
def __bool__(self):
"""Check inputs are in 2-D coordinate"""
return bool(max(self._x, self._y))
μΆλ ₯
print(Vector.__init__.__doc__)
# Create a vector, example : v = Vector(5,10)
print(Vector.__add__.__doc__)
# Return the vector addition of inputs
print(v1, v2, v3)
# Vector(5, 7) Vector(23, 35) Vector(0, 0)
print(v1 + v2)
# Vector(28, 42)
print(v1 * v2)
# Vector(115, 245)
dataclasses ν μ€νΌ
pythonμ dataclassesλ₯Ό μ¬μ©ν΄μ μμμ μμ±ν ν΄λμ€λ₯Ό λ³΄λ€ λ κ°μ ν μμ΅λλ€.
from dataclasses import dataclass
@dataclass
class Vector(object):
_x : int = 0
_y : int = 0
def __repr__(self) -> str:
"""Return the Vector information"""
return f"Vector({self._x}, {self._y})"
def __add__(self, other):
"""Return the vector addition of inputs"""
return Vector(self._x + other._x, self._y + other._y)
def __mul__(self, other):
"""Return the vector multiply of inputs"""
return Vector(self._x * other._x, self._y * other._y)
def __bool__(self):
"""Check inputs are in 2-D coordinate"""
return bool(max(self._x, self._y))
>>> print(v1, v2, v3)
# Vector(5, 7) Vector(23, 35) Vector(0, 0)
>>> print(v1 + v2)
# Vector(28, 42)
>>> print(v1 * v2)
# Vector(115, 245)
dataclassλ₯Ό μ¬μ©νλ―λ‘μ¨, __init__
λ©μλμμ 볡μ‘νκ² μΈμλ₯Ό λ°μ μ½λλ₯Ό μμ± ν λ 보λ€. μ½λμ κ°λ
μ±μ΄ μ’μμ§κ³ μ¬μ©μ±λ μ’μ μ‘μ΅λλ€.