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

الصفحات

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

دورة البرمجة بلغة بايثون - الدرس الخامس والثلاثون (الوراثة)

دورة البرمجة بلغة بايثون - الدرس الخامس والثلاثون (الوراثة)

الوراثة هي ميزة قوية في البرمجة الشيئية.

يشير إلى تحديد فئة جديدة مع تعديل بسيط أو بدون تعديل على فئة موجودة. يطلق على الفئة الجديدة فئة مشتقة (أو فرعية) وتسمى الفئة التي ترث منها الفئة الأساسية (الأصل).


صيغة الوراثة في بايثون

class BaseClass:
  Body of base class
class DerivedClass(BaseClass):
  Body of derived class

ترث الفئة المشتقة ميزات من الفئة الأساسية حيث يمكن إضافة ميزات جديدة إليها. ينتج عن هذا إعادة استخدام الكود.


مثال على الوراثة في بايثون

لإثبات استخدام الوراثة ، دعونا نأخذ مثالاً.

المضلع شكل مغلق به 3 جوانب أو أكثر. لنفترض أن لدينا فئة تسمى Polygon محددة على النحو التالي.

class Polygon:
    def __init__(self, no_of_sides):
        self.n = no_of_sides
        self.sides = [0 for i in range(no_of_sides)]

    def inputSides(self):
        self.sides = [float(input("Enter side "+str(i+1)+" : ")) for i in range(self.n)]

    def dispSides(self):
        for i in range(self.n):
            print("Side",i+1,"is",self.sides[i])


تحتوي هذه الفئة على سمات بيانات لتخزين عدد الجوانب n وحجم كل جانب كقائمة تسمى الجوانب.


تأخذ دالة ()inputSides حجم كل جانب وتعرض ()dispSides أطوال هذه الجوانب.


المثلث هو مضلع بثلاثة أضلاع. لذلك ، يمكننا إنشاء فئة تسمى Triangle والتي ترث من Polygon. هذا يجعل جميع سمات فئة Polygon متاحة لفئة Triangle.


لا نحتاج إلى تعريفها مرة أخرى (قابلية إعادة استخدام الكود). يمكن تعريف المثلث على النحو التالي.

class Triangle(Polygon):
    def __init__(self):
        Polygon.__init__(self,3)

    def findArea(self):
        a, b, c = self.sides
        # calculate the semi-perimeter
        s = (a + b + c) / 2
        area = (s*(s-a)*(s-b)*(s-c)) ** 0.5
        print('The area of the triangle is %0.2f' %area)


ومع ذلك ، فإن الفئة Triangle لديها دالة جديدة ()findArea لإيجاد وطباعة مساحة المثلث. هنا نموذج.

>>> t = Triangle()

>>> t.inputSides()
Enter side 1 : 3
Enter side 2 : 5
Enter side 3 : 4

>>> t.dispSides()
Side 1 is 3.0
Side 2 is 5.0
Side 3 is 4.0

>>> t.findArea()
The area of the triangle is 6.00


يمكننا أن نرى أنه على الرغم من أننا لم نحدد دوال مثل ()inputSides أو ()dispSides لفئة Triangle بشكل منفصل ، فقد تمكنا من استخدامها.


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


طريقة التجاوز في بايثون

في المثال أعلاه ، لاحظ أن طريقة __init __ تم تعريفها في كلا الفئتين ، المثلث والمضلع. عند حدوث ذلك ، تتجاوز الطريقة في الفئة المشتقة تلك الموجودة في الفئة الأساسية. هذا يعني أن __init __  في المثلث يحصل على الأفضلية على __init__ في المضلع.


بشكل عام عند تجاوز طريقة أساسية ، نميل إلى توسيع التعريف بدلاً من استبداله ببساطة. يتم إجراء نفس الشيء عن طريق استدعاء الطريقة في الفئة الأساسية من الفئة المشتقة (استدعاء Polygon .__ init __ من __init __  في المثلث).


الخيار الأفضل هو استخدام الوظيفة المدمجة ()super. إذن ، super .__ init __ (3) تكافئ المضلع .__ init __ (self، 3) ويفضل. لمعرفة المزيد حول وظيفة ()super في Python ، قم بزيارة دالة Python super.


يتم استخدام وظيفتين مضمنتين هما isinstance و issubclass للتحقق من الوراثة.


ترجع الدالة isinstance القيمة True إذا كان الكائن مثيلاً للفئة أو الفئات الأخرى المشتقة منها. ترث كل فئة في Python من كائن الفئة الأساسية.

>>> isinstance(t,Triangle)
True

>>> isinstance(t,Polygon)
True

>>> isinstance(t,int)
False

>>> isinstance(t,object)
True


وبالمثل ، يتم استخدام issubclass  للتحقق من وراثة الفئة.

>>> issubclass(Polygon,Triangle)
False

>>> issubclass(Triangle,Polygon)
True

>>> issubclass(bool,int)
True
reaction:
Ahmed Taher
Ahmed Taher
مدون من العراق . احب البرمجة وكل ما يتعلق بالشبكات والسيرفرات وامن المعلومات . واسعى الى توفير جميع المصادر والمواد للامتحانات الدولية.

تعليقات