๋งค์ง ๋ฉ์๋ (Magic Methods)๋?
1. ๋งค์ง ๋ฉ์๋ ์ ์
๋งค์ง ๋ฉ์๋(๋๋ ๋๋ ๋ฉ์๋, `Dunder Method`)๋ ํ์ด์ฌ ํด๋์ค์์ ํน์ ๊ธฐ๋ฅ์ ์ํํ๋๋ก ๋ฏธ๋ฆฌ ์ ์๋ ํน์ํ ๋ฉ์๋๋ค.
์ด๋ฆ์ด `__`(์ธ๋์ค์ฝ์ด ๋ ๊ฐ)๋ก ๊ฐ์ธ์ฌ ์์ผ๋ฉฐ, ๊ฐ์ฒด์ ์ฐ์ฐ, ํํ ๋ฐฉ์, ์ปจํ ์ด๋ ๊ธฐ๋ฅ ๋ฑ์ ์ค๋ฒ๋ผ์ด๋ฉํ์ฌ ์ปค์คํ ๋์์ ๊ตฌํํ ๋
์ฌ์ฉํ๋ค.
์์ :
class Example:
def __init__(self, value):
self.value = value
def __str__(self):
return f"Example({self.value})"
obj = Example(10)
print(obj) # Example(10)
2. ์ฃผ์ ๋งค์ง ๋ฉ์๋ ์ ๋ฆฌ
1) ๊ฐ์ฒด ์์ฑ ๋ฐ ์๋ฉธ ๊ด๋ จ ๋ฉ์๋
๋ฉ์๋ | ์ค๋ช |
`__init__` | ์์ฑ์, ๊ฐ์ฒด ์ด๊ธฐํ |
`__del__` | ์๋ฉธ์, ๊ฐ์ฒด ์ญ์ ์ ํธ์ถ |
`__new__` | ์ธ์คํด์ค ์์ฑ, `__init__`๋ณด๋ค ๋จผ์ ํธ์ถ๋จ |
`__repr__` | ๊ณต์์ ์ธ ๋ฌธ์์ด ๋ฐํ (๋๋ฒ๊น ์ฉ) |
`__str__` | ๋น๊ณต์ ๋ฌธ์์ด ๋ฐํ (์ฌ์ฉ์์ฉ) |
2) ์ฐ์ฐ์ ์ค๋ฒ๋ก๋ฉ ๊ด๋ จ ๋ฉ์๋
๋ฉ์๋ | ์ฐ์ฐ์ |
`__add__` | `+` |
`__sub__` | `-` |
`__mul__` | `*` |
`__truediv__` | `/` |
`__floordiv__` | `//` |
`__mod__` | `%` |
`__pow__` | `**` |
`__eq__` | `==` |
`__ne__` | `!=` |
`__lt__` | `<` |
`__le__` | `<=` |
`__gt__` | `>` |
`__ge__` | `>=` |
์์ :
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __add__(self, other):
return Vector(self.x + other.x, self.y + other.y)
def __repr__(self):
return f"Vector({self.x}, {self.y})"
v1 = Vector(2, 3)
v2 = Vector(4, 5)
print(v1 + v2) # Vector(6, 8)
3) ์์ฑ ๋ฐ ์ธ๋ฑ์ค ์ ๊ทผ ๊ด๋ จ ๋ฉ์๋
๋ฉ์๋ | ์ค๋ช |
`__getitem__` | `obj[key]` ํํ๋ก ์์ ์ ๊ทผ |
`__setitem__` | `obj[key] = value` ํํ๋ก ์์ ๋ณ๊ฒฝ |
`__delitem__` | `del obj[key]` ํํ๋ก ์์ ์ญ์ |
`__len__` | `len(obj)` ํธ์ถ ์ ๊ธธ์ด ๋ฐํ |
`__contains__` | `value in obj` ์คํ |
์์ :
class CustomList:
def __init__(self, data):
self.data = data
def __getitem__(self, index):
return self.data[index]
def __setitem__(self, index, value):
self.data[index] = value
def __len__(self):
return len(self.data)
c = CustomList([1, 2, 3])
print(c[1]) # 2
c[1] = 100
print(c.data) # [1, 100, 3]
print(len(c)) # 3
4) ํธ์ถ ๋ฐ ์์ฑ ๊ด๋ จ ๋งค์ง ๋ฉ์๋
๋ฉ์๋ | ์ค๋ช |
`__call__` | ๊ฐ์ฒด๋ฅผ ํจ์์ฒ๋ผ ํธ์ถ ๊ฐ๋ฅ (`obj()`) |
`__getattr__` | ์กด์ฌํ์ง ์๋ ์์ฑ ์ ๊ทผ ์ ํธ์ถ |
`__setattr__` | ์์ฑ ์ค์ ์ ํธ์ถ (`obj.attr = value`) |
`__delattr__` | ์์ฑ ์ญ์ ์ ํธ์ถ (`del obj.attr`) |
์์ (`__call__` ์ฌ์ฉ):
class CallableObject:
def __call__(self, x):
return x * 2
obj = CallableObject()
print(obj(10)) # 20
5) ์ปจํ ์คํธ ๋งค๋์ ๊ด๋ จ (`with` ๋ฌธ ์ง์)
๋ฉ์๋ | ์ค๋ช |
`__enter__` | `with` ๋ฌธ ์ง์ ์ ์คํ |
`__exit__` | `with` ๋ฌธ ์ข ๋ฃ ์ ์คํ |
์์ :
class FileManager:
def __init__(self, filename, mode):
self.file = open(filename, mode)
def __enter__(self):
return self.file
def __exit__(self, exc_type, exc_value, traceback):
self.file.close()
with FileManager("test.txt", "w") as f:
f.write("Hello, world!")
3. ๋งค์ง ๋ฉ์๋ ํ์ฉ ์์
1) ์ปค์คํ ๋น๊ต ์ฐ์ฐ ๊ตฌํ
class Student:
def __init__(self, name, score):
self.name = name
self.score = score
def __lt__(self, other): # `<` ์ฐ์ฐ์ ์ค๋ฒ๋ก๋ฉ
return self.score < other.score
s1 = Student("Alice", 85)
s2 = Student("Bob", 90)
print(s1 < s2) # True
2) ๊ฐ์ฒด๋ฅผ ํจ์์ฒ๋ผ ์ฌ์ฉ (`__call__`)
class Multiply:
def __init__(self, factor):
self.factor = factor
def __call__(self, x):
return x * self.factor
double = Multiply(2)
print(double(10)) # 20
๋งค์ง ๋ฉ์๋ ์ ๋ฆฌ:
1๏ธโฃ ๋งค์ง ๋ฉ์๋๋ `__init__`, `__str__`, `__add__` ๊ฐ์ ํ์ด์ฌ์ ํน์ ๋ฉ์๋์ด๋ค~
2๏ธโฃ ๊ฐ์ฒด ์์ฑ, ์ฐ์ฐ์ ์ค๋ฒ๋ก๋ฉ, ์์ฑ ์ ๊ทผ, ์ปจํ ์คํธ ๋งค๋์ ๋ฑ์ ํ์ฉ๋๋ค~
3๏ธโฃ ๋งค์ง ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํ๋ฉด ์ปค์คํ ๋์์ ์ ์ํ ์ ์๋ค~
'AI ๐ค > Python ๐ป' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[250218] f-string (Formatted String Literal)์ด๋? (0) | 2025.02.18 |
---|---|
[250127] bin() ํจ์๋?? (0) | 2025.01.27 |
[250124] ๊ธฐ์ตํด, super()~!~! (0) | 2025.01.24 |
[250109] ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ(Object-Oriented Programming) ํน์ง (0) | 2025.01.09 |
[250106] ์ฌ๊ทํจ์ ์ ๋ฆฌ (0) | 2025.01.06 |