Dunder methods ("double underscore" หรือเรียกว่า magic/special methods) เป็นเมธอดที่มีชื่อพิเศษเช่น __init__, __str__, ที่ให้วัตถุของคุณสามารถบูรณาการกับ Python เรียกมันโดยอัตโนมัติเพื่อตอบสนองต่อไวยากรณ์ — ตัวอย่างเช่น เรียก
__len__len(obj)obj.__len__()class Vector:
def __init__(self, x, y): # constructor — Vector(1, 2)
self.x, self.y = x, y
def __repr__(self): # repr(v) and the REPL — for developers
return f"Vector({self.x}, {self.y})"
def __str__(self): # str(v) / print(v) — for users
return f"({self.x}, {self.y})"
def __add__(self, other): # enables the + operator: v1 + v2
return Vector(self.x + other.x, self.y + other.y)
def __eq__(self, other): # enables ==
return self.x == other.x and self.y == other.y
v1, v2 = Vector(1, 2), Vector(3, 4)
v1 + v2 # Vector(4, 6) — calls __add__
print(v1) # (1, 2) — calls __str__
v1 == Vector(1, 2) # True — calls __eq__
การกำหนดสิ่งเหล่านี้ช่วยให้วัตถุที่กำหนดเองของคุณทำงานกับไวยากรณ์ในตัว (+, ==, print) เหมือนประเภทในตัว
__init__ → constructor (object creation)
__repr__ → unambiguous developer representation (debugging, REPL)
__str__ → readable user-facing string (print, str())
__len__ → len(obj)
__getitem__→ obj[key] (indexing/subscripting)
__iter__ / __next__ → make an object iterable (for loops)
__eq__, __lt__, __gt__ → comparison operators (==, <, >)
__add__, __sub__, __mul__ → arithmetic operators
__call__ → make an instance callable like a function: obj()
__contains__ → the `in` operator
__enter__ / __exit__ → context managers (with statement)
class Deck:
def __init__(self): self.cards = [...]
def __len__(self): return len(self.cards) # len(deck)
def __getitem__(self, i): return self.cards[i] # deck[0], and iteration/slicing!
deck = Deck()
len(deck) # works
for card in deck: # __getitem__ makes it iterable too
...
การใช้ __len__ และ __getitem__ ทำให้วัตถุทำงานเหมือนลำดับ — รองรับ len(), การจัดทำดัชนี, การวนซ้ำ, และการตัด
Dunder methods คือวิธีที่ Python บรรลุประสบการณ์ "ทุกอย่างเป็นวัตถุ" ที่สอดคล้องกัน — พวกมันช่วยให้คลาสที่กำหนดเองของคุณบูรณาการอย่างราบรื่นกับตัวดำเนินการและฟังก์ชันในตัวของภาษา (+, ==, len(), for, [], with, print)
นี่คือรากฐานของการออกแบบที่หรูหรา polymorphic ของ Python ("duck typing" + data model)
การรู้จัก dunder ที่สำคัญ — โดยเฉพาะ __init__, __repr__/__str__, ตัวดำเนินการเปรียบเทียบและเลขคณิต, และโปรโตคอลการวนซ้ำ — ช่วยให้คุณสร้างคลาสที่เข้าใจได้และ Pythonic ที่รู้สึกเหมือนประเภทในตัว, และอธิบายว่าไวยากรณ์ของภาษาแมปไปยังการเรียกเมธอดใต้ฝากระบอก