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

الصفحات

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

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

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

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


في الوراثة المتعددة ، يتم توريث ميزات جميع الفئات الأساسية في الفئة المشتقة. يشبه بناء جملة الميراث المتعدد الميراث الفردي.


مثال

class Base1:
    pass

class Base2:
    pass

class MultiDerived(Base1, Base2):
    pass


هنا ، يتم اشتقاق فئة MultiDerived من فئتي Base1 و Base2.

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


ترث الفئة MultiDerived من كلا الفئتين Base1 و Base2.


الميراث متعدد المستويات بيثون

يمكننا أيضًا أن نرث من فئة مشتقة. هذا يسمى الميراث متعدد المستويات. يمكن أن يكون من أي عمق في بايثون.


في الوراثة متعددة المستويات ، يتم توريث ميزات الفئة الأساسية والفئة المشتقة إلى الفئة المشتقة الجديدة.


ويرد أدناه مثال مع التصور المقابل.

class Base:
    pass

class Derived1(Base):
    pass

class Derived2(Derived1):
    pass


هنا ، مشتق الفئة 1 مشتق من الفئة الأساسية ، والفئة المشتقة 2 مشتقة من الفئة المشتقة 1.

الوراثة متعددة المستويات في بايثون


ترتيب قرار الأسلوب في بايثون

كل فئة في بايثون مشتقة من فئة الكائن. إنه النوع الأساسي في بايثون.


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

# Output: True
print(issubclass(list,object))

# Output: True
print(isinstance(5.5,object))

# Output: True
print(isinstance("Hello",object))


في سيناريو التوريث المتعدد ، يتم البحث عن أي سمة محددة أولاً في الفئة الحالية. إذا لم يتم العثور عليها ، يستمر البحث في فصول الآباء بطريقة العمق أولاً ، واليسار واليمين دون البحث في نفس الكلاس مرتين.


لذلك ، في المثال أعلاه لفئة MultiDerived ، يكون ترتيب البحث هو [MultiDerived ، Base1 ، Base2 ، كائن]. يسمى هذا الترتيب أيضًا التحويل الخطي لفئة MultiDerived وتسمى مجموعة القواعد المستخدمة للعثور على هذا الترتيب ترتيب حل الطريقة (MRO).


يجب أن تمنع MRO ترتيب الأسبقية المحلية وأن توفر أيضًا الرتابة. إنه يضمن ظهور الفصل دائمًا أمام والديها. في حالة تعدد الآباء ، يكون الترتيب هو نفسه مجموعات الفئات الأساسية.


يمكن النظر إلى MRO للفصل على أنه سمة __mro__ أو دالة mro. الأول يقوم بإرجاع tuple بينما يقوم الأخير بإرجاع قائمة.

>>> MultiDerived.__mro__
(<class '__main__.MultiDerived'>,
 <class '__main__.Base1'>,
 <class '__main__.Base2'>,
 <class 'object'>)

>>> MultiDerived.mro()
[<class '__main__.MultiDerived'>,
 <class '__main__.Base1'>,
 <class '__main__.Base2'>,
 <class 'object'>]


فيما يلي مثال أكثر تعقيدًا على الوراثة المتعددة وتصورها جنبًا إلى جنب مع MRO.

تصور الوراثة المتعددة


# Demonstration of MRO

class X:
    pass


class Y:
    pass


class Z:
    pass


class A(X, Y):
    pass


class B(Y, Z):
    pass


class M(B, A, Z):
    pass

# Output:
# [<class '__main__.M'>, <class '__main__.B'>,
#  <class '__main__.A'>, <class '__main__.X'>,
#  <class '__main__.Y'>, <class '__main__.Z'>,
#  <class 'object'>]

print(M.mro())


الناتج

[<class '__main__.M'>, <class '__main__.B'>, <class '__main__.A'>, <class '__main__.X'>, <class '__main__.Y'>, <class '__main__.Z'>, <class 'object'>]


لمعرفة الخوارزمية الفعلية حول كيفية حساب MRO ، قم بزيارة مناقشة MRO.

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

تعليقات