سفارشیسازی رفتار شیء با متدهای دو خط زیرین
متدهایی که با دو خط زیرین شروع و تمام میشوند (مانند __init__) به آنها dunder methods گفته میشود و رفتار داخلی شیء را در برابر عملگرها و توابع داخلی پایتون تعیین میکنند.
class Money:
def __init__(self, amount):
self.amount = amount
def __add__(self, other):
return Money(self.amount + other.amount)
def __repr__(self):
return f"Money({self.amount})"
def __eq__(self, other):
return self.amount == other.amount
a = Money(1000)
b = Money(500)
print(a + b) # Money(1500)
print(a == Money(1000)) # Trueبا پیادهسازی __add__ عملگر + روی اشیای کلاس شما نیز کار میکند. متدهای مشابه دیگری مانند __sub__، __lt__ (کوچکتر بودن)، __len__ و __str__ نیز به همین شکل رفتار شیء را در برابر عملگرها و توابع داخلی مانند len() یا print() تعیین میکنند.
تفاوت __repr__ و __str__ این است که __repr__ برای نمایش فنی و دقیق شیء (مثلاً در دیباگر) در نظر گرفته شده، در حالی که __str__ برای نمایش خوانا به کاربر است. اگر فقط یکی را تعریف کنید، پایتون در نبود __str__ از __repr__ استفاده میکند.