القائمة الرئيسية

الصفحات

دورة البرمجة بلغة بايثون - الدرس الثامن والثلاثون (معامل الحمل الزائد)

دورة البرمجة بلغة بايثون - الدرس الثامن والثلاثون (معامل الحمل الزائد)

دورة البرمجة بلغة بايثون - الدرس الثامن والثلاثون (معامل الحمل الزائد)

يمكنك تغيير معنى عامل التشغيل في بايثون اعتمادًا على المعاملات المستخدمة. في هذا البرنامج التعليمي ، ستتعلم كيفية استخدام التحميل الزائد على المشغل في البرمجة الموجهة للكائنات.


زيادة تحميل مشغل بايثون

يعمل مشغلو بايثون مع الفئات المضمنة. لكن نفس العامل يتصرف بشكل مختلف مع أنواع مختلفة. على سبيل المثال ، سيجري عامل التشغيل + إضافة حسابية على رقمين ، أو يدمج قائمتين ، أو يسلسل سلسلتين.


هذه الميزة في Python التي تسمح لنفس المشغل بأن يكون له معنى مختلف وفقًا للسياق تسمى التحميل الزائد للمشغل.


إذن ماذا يحدث عندما نستخدمها مع كائنات من فئة محددة بواسطة المستخدم؟ دعونا نفكر في الفئة التالية ، والتي تحاول محاكاة نقطة في نظام الإحداثيات ثنائي الأبعاد.

class Point:
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y


p1 = Point(1, 2)
p2 = Point(2, 3)
print(p1+p2)


الناتج

Traceback (most recent call last):
  File "<string>", line 9, in <module>
    print(p1+p2)
TypeError: unsupported operand type(s) for +: 'Point' and 'Point'


هنا ، يمكننا أن نرى أنه تم رفع خطأ TypeError ، لأن Python لم تكن تعرف كيفية إضافة كائنين نقطيين معًا.


ومع ذلك ، يمكننا تحقيق هذه المهمة في Python من خلال التحميل الزائد على المشغل. لكن أولاً ، دعنا نتعرف على فكرة حول الوظائف الخاصة.


وظائف بايثون الخاصة

وظائف الفئة التي تبدأ بشرطة سفلية مزدوجة __ تسمى وظائف خاصة في بايثون.


هذه الوظائف ليست وظائف نموذجية نحددها للفصل. دالة __init __ () التي حددناها أعلاه هي واحدة منها. يتم استدعاؤه في كل مرة نقوم فيها بإنشاء كائن جديد من تلك الفئة.


هناك العديد من الوظائف الخاصة الأخرى في بايثون. قم بزيارة وظائف Python الخاصة لمعرفة المزيد عنها.


باستخدام وظائف خاصة ، يمكننا جعل فصولنا متوافقة مع الوظائف المضمنة.


>>> p1 = Point(2,3)
>>> print(p1)
<__main__.Point object at 0x00000000031F8CC0>


لنفترض أننا نريد أن تقوم وظيفة print () بطباعة إحداثيات كائن Point بدلاً من ما حصلنا عليه. يمكننا تحديد طريقة __str __ () في صفنا والتي تتحكم في كيفية طباعة الكائن. لنلق نظرة على كيفية تحقيق ذلك:

class Point:
    def __init__(self, x = 0, y = 0):
        self.x = x
        self.y = y
    
    def __str__(self):
        return "({0},{1})".format(self.x,self.y)


لنجرب الآن وظيفة print () مرة أخرى.

class Point:
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y

    def __str__(self):
        return "({0}, {1})".format(self.x, self.y)


p1 = Point(2, 3)
print(p1)


الناتج


(2, 3)


هذا أفضل. تبين أنه يتم استدعاء هذه الطريقة نفسها عندما نستخدم الدالة المضمنة str () أو format ().

>>> str(p1)
'(2,3)'

>>> format(p1)
'(2,3)'


لذلك ، عند استخدام str (p1) أو التنسيق (p1) ، تستدعي Python داخليًا طريقة p1 .__ str __ (). ومن هنا الاسم ، وظائف خاصة.


الآن دعنا نعود إلى التحميل الزائد على المشغل.


زيادة التحميل على المشغل +

لزيادة تحميل عامل التشغيل + ، سنحتاج إلى تنفيذ وظيفة __add __ () في الكلاس. مع القوة العظيمة تأتي المسؤولية العظيمة. يمكننا أن نفعل ما نشاء داخل هذه الدالة. ولكن من المنطقي أكثر إرجاع كائن نقطة من مجموع الإحداثي.

class Point:
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y

    def __str__(self):
        return "({0},{1})".format(self.x, self.y)

    def __add__(self, other):
        x = self.x + other.x
        y = self.y + other.y
        return Point(x, y)


لنجرب الآن عملية الإضافة مرة أخرى:

class Point:
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y

    def __str__(self):
        return "({0},{1})".format(self.x, self.y)

    def __add__(self, other):
        x = self.x + other.x
        y = self.y + other.y
        return Point(x, y)


p1 = Point(1, 2)
p2 = Point(2, 3)

print(p1+p2)


الناتج

(3,5)

ما يحدث في الواقع هو أنه عند استخدام p1 + p2 ، تستدعي Python p1 .__ أضف __ (p2) والتي بدورها هي Point .__ add __ (p1، p2). بعد ذلك ، تتم عملية الإضافة بالطريقة التي حددناها.


وبالمثل ، يمكننا زيادة التحميل على المشغلين الآخرين أيضًا. يتم جدولة الوظيفة الخاصة التي نحتاج إلى تنفيذها أدناه.

تعبير المشغل داخليا


مشغلي التحميل الزائد

لا تقصر Python التحميل الزائد على المشغل على العوامل الحسابية فقط. يمكننا زيادة التحميل على مشغلي المقارنة أيضًا.


لنفترض أننا أردنا تنفيذ رمز أقل من <في فئة Point الخاصة بنا.


دعونا نقارن حجم هذه النقاط من الأصل ونعيد النتيجة لهذا الغرض. يمكن تنفيذه على النحو التالي.

# overloading the less than operator
class Point:
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y

    def __str__(self):
        return "({0},{1})".format(self.x, self.y)

    def __lt__(self, other):
        self_mag = (self.x ** 2) + (self.y ** 2)
        other_mag = (other.x ** 2) + (other.y ** 2)
        return self_mag < other_mag

p1 = Point(1,1)
p2 = Point(-2,-3)
p3 = Point(1,-1)

# use less than
print(p1<p2)
print(p2<p3)
print(p1<p3)


الناتج

True
False
False

وبالمثل ، فإن الوظائف الخاصة التي نحتاج إلى تنفيذها ، لزيادة التحميل على عوامل المقارنة الأخرى موضحة أدناه.


تعبير المشغل داخليا




انت الان في اول مقال
reaction:
Ahmed Taher
Ahmed Taher
مدون من العراق . احب البرمجة وكل ما يتعلق بالشبكات والسيرفرات وامن المعلومات . واسعى الى توفير جميع المصادر والمواد للامتحانات الدولية.

تعليقات