باردهی اضافی عملگر ها چیست ؟

0

باردهی اضافی عملگر ها چیست ؟ 

بعضی زبانهـا، تغییـر تعریـف عملگرهـاي پـیشسـاخته را وقتـی کـه بـهوسـیلۀ انـواع دادهاي کاربر-تعریف استفاده میشوند، ممکن میسازند. این خصیصه باردهی اضافی عملگر نامیده مـیشـود. این کار مخصوصاً هنگام تعریف یک نوع دادهاي جدید ریاضی بسیار مفید است. براي مثال، جهت لغو عمل عملگر جمع، + ، ما متدي به نام __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’

متأسفانه پیغام خطا کمی مبهم است. این برنامه بعضی از مشـکلات برنامـهنویسـی شـیءگرا را نشان میدهد. گاهی کشف کردن اینکه کدام کد در حال اجرا است به حد کافی مشکل است.

برای اموزش های ویدیویی زبان پایتون به بستر ویدیو های اموزشی بروید

بستر اموزش های ویدویی 

کیانا ابراهیمی سوال پاسخ داده شده اکتبر 15, 2020
گذاشتن نظر
پاسخ خود را بنویسید .
  • فعال
  • بازدیدها1901 times
  • پاسخ ها1 پاسخ
ورود به متاورس | متاورس ایرانی
ورود به متاورس ایران یا همان متاورس ملی

علامت ذره بین Tutorials سمت راست به رنگ قرمز به شما کمک خواهد کرد .

جدید ترین سوالات پرسیده شده

منقضی شدن سم بتانال 1 پاسخ | 0 آرا
ایا ایدز گزفتم؟ 0 پاسخ ها | 0 آرا
انتخاب ورزش رزمی 0 پاسخ ها | 1 رای
وزارت تعاون کار و رفاه اجتماعی نماد اعتماد الکترونیک اسناد و املاک کشور مرکز آموزش ویدیویی انجمن حم فروشگاه ملی تولید کنندگان مدیریت بر مدیران حم سامانه حیوانات رسانه ملی اخبار متا دانشگاه متاورس استخدام | دانش فروشگاه حم تبلیغات ملی بازار NFT متاورس رنگ نقشه ملی سه بعدی متا املاک و مستغلات