English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

دليل أساسي في Python

تحكم في العملية في Python

الوظائف في Python

أنواع البيانات في Python

عمليات ملفات Python

أوبجكت والفئات في Python

تاريخ وتوقيت Python

معرفة متقدمة في Python

دليل Python

الوراثة في Python

تسمح الوراثة بتعريف فئة تعتمد على كل功能 من الفئة الأم، وتسمح بإضافة المزيد من الميزات. في هذا المقال، ستعلم كيفية استخدام الوراثة في Python.

ما هي الوراثة؟

الوراثة هي وظيفة قوية في البرمجة المتجهة

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

قواعد الوراثة في Python

class BaseClass:
  # جسم الفئة الأساسية
class DerivedClass(BaseClass):
  # جسم الفئة الفرعية

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

مثال على الوراثة في Python

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

المستطيلات هي شكل م закسر يتكون من 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('طول الجانب ' + str(i+1) + ' : ')) for i in range(self.n)]
    def dispSides(self):
        for i in range(self.n):
            print('طول الجانب', i+1, 'هو', self.sides[i])

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

يأخذ الطريقة inputSides() حجم كل جانب، وبالمثل، يعرض dispSides()ها بشكل صحيح.

المثلث هو متعدد الأوجه الذي يحتوي على 3 أطراف. لذلك، يمكننا إنشاء فئة تسمى Triangle تستمر في Polygon. هذا يجعل جميع الخصائص المتاحة في Polygon سهلة الاستخدام في Triangle. لا نحتاج إلى تعريفها مرة أخرى (استعادة الكود). يتم تعريف Triangle كما يلي.

class Triangle(Polygon):
    def __init__(self):
        Polygon.__init__(self, 3)
    def findArea(self):
        a, b, c = self.sides
        # حساب نصف المحيط
        s = (a + b + c) / 2
        area = (s*(s-a)*(s-b)*(s-c)) ** 0.5
        print('مساحة المثلث هي %0.2f' % area)

لكن، الفئة class Triangle تحتوي على طريقة جديدة findArea() لتحديد وطباعة منطقة المثلث. هذا هو مثال على التشغيل.

>>> t = Triangle()
>>> t.inputSides()
طول الجانب المدخل 1: 3
طول الجانب المدخل 2: 5
طول الجانب المدخل 3: 4
>>> t.dispSides()
طول الجانب 1 هو 3.0
طول الجانب 2 هو 5.0
طول الجانب 3 هو 4.0
>>> t.findArea()
مساحة المثلث هي 6.00

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

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

مقالات ببايثون

في المثال السابق، لاحظ أن كلا الفئتين Triangle و Polygon تعريف كل منهما أسلوب __init__. عند حدوث ذلك، سيتم تغطية الأسلوب في الفئة الأساسية من قبل الأسلوب في الفئة المشتقة. أي أن __init__ في Triangle يأخذ الأسبقية على __init__ في Polygon.

عادةً، عند تغيير الأساليب الأساسية، نحن نفضل توسيع التعريف بدلاً من استبداله ببساطة. يمكن تحقيق نفس النتيجة عن طريق استدعاء الأسلوب من الفئة الأساسية في الفئة المشتقة (استدعاء Polygon.__init__() من __init__ في Triangle).

خيار أفضل هو استخدام وظائف مدمجة super(). لذلك، super().__init__(3) مساوية ل Polygon.__init__(self, 3) وهي الخيار المفضل. يمكنك معرفة المزيد عنفي بايثونمنوظيفة super()المزيد من المعلومات.

هناك وظائف داخلة إثنين isinstance()، issubclass() تستخدم للتحقق من الإرث. إذا كان العنصر مثالاً على هذا الكائن أو أي فئة أخرى مشتقة منه، فإن وظيفة isinstance() تعود قيمة True. كل فئة في بايثون تنحدر من الفئة الأساسية object.

>>> isinstance(t, Triangle)
الحقيقة
>>> isinstance(t, Polygon)
الحقيقة
>>> isinstance(t, int)
ال假的
>>> isinstance(t, object)
الحقيقة

على سبيل المثال، issubclass() تستخدم للتحقق من الإرث.

>>> issubclass(Polygon, Triangle)
ال假的
>>> issubclass(Triangle, Polygon)
الحقيقة
>>> issubclass(bool, int)
الحقيقة