باردهی اضافی عملگر ها چیست ؟
باردهی اضافی عملگر ها چیست ؟
بعضی زبانهـا، تغییـر تعریـف عملگرهـاي پـیشسـاخته را وقتـی کـه بـهوسـیلۀ انـواع دادهاي کاربر-تعریف استفاده میشوند، ممکن میسازند. این خصیصه باردهی اضافی عملگر نامیده مـیشـود. این کار مخصوصاً هنگام تعریف یک نوع دادهاي جدید ریاضی بسیار مفید است. براي مثال، جهت لغو عمل عملگر جمع، + ، ما متدي به نام __add __را تهیه میکنیم:
class Point:
# previously defined methods here…
def __add__(self, other):
return Point(self.x + other.x, self.y + other.y)
به طور معمول، اولین پارامتر شیئی است که متد بر روي آن احضار میشود. دومـین پـارامتر بـه نحو مناسبی براي تمیز دادن آن از self ، other نامگذاري شده است. بـراي جمـع دو Point مـا یک Point جدید که شامل جمع مختصهاي x و مختصهاي y است برمیگردانیم. حال وقتی عملگر + را براي شیء Point بهکار میبریم، پایتون __add __را احضار میکند:
>>> p1 = Point(3, 4)
>>> p2 = Point(5, 7)
>>> p3 = p1 + p2
>>> print p3
(8, 11)
عبارت p2+p1 معادل (p2__(add.__p1 است، اما همانطور کـه مـیبینیـد بـه صـورتی بسیار زیباتر.
تمرین 14-3 :متدي به نام (other, self__(sub __به کلاس Point اضـافه کنیـد که عملگر تفریق را باردهی اضافی کند و سپس آن را آزمایش نمایید. براي لغو عمل عملگر ضرب چندین راه وجود دارد. یکی از آنها تعریف متدي به نام __mul__ یا __rmul __یا هر دو است. اگر عملوند سمت چپ *، یک Point باشد، پایتون __mul __را احضار مـیکنـد، چـرا کـه فرض میکند عملوند دیگر هم یک Point است. این متد حاصلضرب نقطهاي دو نقطه را بر اسـاس قوانین جبر خطی محاسبه میکند:
def __mul__(self, other):
return self.x * other.x + self.y * other.y
اگر عملوند سمت چپ * یکی از انواع دادهاي اولیه و عملوند سمت راست، یـک Point باشـد، پایتون __mul __را احضار میکند که ضرب اسکالر را انجام میدهد:
def __rmul__(self, other):
return Point(other * self.x, other * self.y)
نتیجه یک Point جدید است که مختصهاي آن یک مضرب از مختصهاي اصلی اسـت. اگـر other از نوعی باشد که نتواند در یک عدد اعشاري ضرب شود، __rmul __پیغام خطایی را نمایش خواهد داد. این مثال هر دو نوع ضرب را نشان میدهد:
>> p1 = Point(3, 4)
>>> p2 = Point(5, 7)
>>> print p1 * p2
43
>>> print 2 * p2
(10, 14)
اگر بخواهیم 2*p2 را محاسبه کنیم، چه اتفاقی میافتد؟ از آنجا که پـارامتر اول یـک Point است، پایتون __mul __را احضـار مـیکنـد و 2 را بـهعنـوان آرگومـان دوم در نظـر مـیگیـرد. درون __mul __برنامه سعی میکند به مختص x از other دست یابد که مـردود اسـت، زیـرا یـک عـدد صحیح هیچ مشخصهاي ندارد:
>> print p2 * 2
AttributeError: ‘int’ object has no attribute ‘x’
متأسفانه پیغام خطا کمی مبهم است. این برنامه بعضی از مشـکلات برنامـهنویسـی شـیءگرا را نشان میدهد. گاهی کشف کردن اینکه کدام کد در حال اجرا است به حد کافی مشکل است.
برای اموزش های ویدیویی زبان پایتون به بستر ویدیو های اموزشی بروید