بايثون super() – بايثون 3 super()

يسمح لنا الدالة super() في Python بالإشارة صراحة إلى الفئة الأم. إنها مفيدة في حالة الوراثة حيث نريد استدعاء وظائف الفئة الأم.

بايثون super

لفهم دالة super في Python ، يجب عليك أن تعرف عن وراثة بايثون. في وراثة بايثون ، ترث الفئات الفرعية من الفئة الأم. تسمح لنا دالة super() في Python بالإشارة إلى الفئة الأم ضمنياً. لذلك ، تجعل دالة super في Python مهمتنا أسهل وأكثر راحة. عند الإشارة إلى الفئة الأم من الفئة الفرعية ، لا نحتاج إلى كتابة اسم الفئة الأم بشكل صريح. في الأقسام التالية ، سنناقش دالة super في Python.

مثال على دالة super في Python

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

class Person:
    # تهيئة المتغيرات

    name = ""
    age = 0

    
# تعريف المُنشئ

    def __init__(self, person_name, person_age):
        self.name = person_name
        self.age = person_age

        
# تعريف طرق الصنف


    def show_name(self):
        print(self.name)

    def show_age(self):
        print(self.age)



# بدء تعريف الفرع

class Student(Person):
    studentId = ""

    def __init__(self, student_name, student_age, student_id):
        Person.__init__(self, student_name, student_age)
        self.studentId = student_id

    def get_id(self):
        return self.studentId  # returns the value of student id



# نهاية تعريف الفرع




# إنشاء كائن من الفئة الأساسية

person1 = Person("Richard", 23)

# استدعاء طرق الأعضاء للكائنات

person1.show_age()

# إنشاء كائن من الفرع

student1 = Student("Max", 22, "102")
print(student1.get_id())
student1.show_name()

في المثال أعلاه، قمنا بتعيين دالة الفئة الأب على النحو التالي:

Person.__init__(self, student_name, student_age) 

يمكننا استبدال هذا باستدعاء وظيفة السوبر في بايثون كما هو موضح أدناه.

super().__init__(student_name, student_age)

ستظل النتيجة كما هي في كلا الحالتين، كما هو موضح في الصورة أدناه.

بايثون 3 سوبر

يرجى ملاحظة أن الصيغة أعلاه هي لوظيفة بايثون 3 السوبر. إذا كنت تستخدم إصدارات بايثون 2.x، فسيكون الأمر مختلفًا قليلاً وستضطر إلى القيام بالتغييرات التالية:

class Person(object):
...
        super(Student, self).__init__(student_name, student_age)

التغيير الأول هو أن يكون object هو الفئة الأساسية للشخص. من الضروري استخدام وظيفة السوبر في إصدارات بايثون 2.x. وإلا، ستحصل على الخطأ التالي.

Traceback (most recent call last):
  File "super_example.py", line 40, in <module>
    student1 = Student("Max", 22, "102")
  File "super_example.py", line 25, in __init__
    super(Student, self).__init__(student_name, student_age)
TypeError: must be type, not classobj

التغيير الثاني في صيغة وظيفة السوبر نفسها. كما يمكن رؤية أن وظيفة السوبر في بايثون 3 أسهل بكثير في الاستخدام وصيغتها تبدو نظيفة أيضًا.

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

كما ذكرنا سابقًا أن وظيفة super() في Python تسمح لنا بالإشارة إلى الفئة الأبوية ضمنيًا. ولكن في حالة الوراثة متعددة المستويات، أي فئة ستشير؟ حسنًا، ستشير وظيفة super() في Python دائمًا إلى الفئة الأبوية الفورية. كما أن وظيفة super() في Python ليست فقط يمكنها الإشارة إلى الدالة __init__() ولكن يمكنها أيضًا استدعاء جميع الدوال الأخرى للفئة الأبوية. لذا، في المثال التالي، سنرى ذلك.

class A:
    def __init__(self):
        print('Initializing: class A')

    def sub_method(self, b):
        print('Printing from class A:', b)


class B(A):
    def __init__(self):
        print('Initializing: class B')
        super().__init__()

    def sub_method(self, b):
        print('Printing from class B:', b)
        super().sub_method(b + 1)


class C(B):
    def __init__(self):
        print('Initializing: class C')
        super().__init__()

    def sub_method(self, b):
        print('Printing from class C:', b)
        super().sub_method(b + 1)


if __name__ == '__main__':
    c = C()
    c.sub_method(1)

لنرى إخراج مثال Python 3 السابق مع الوراثة متعددة المستويات.

Initializing: class C
Initializing: class B
Initializing: class A
Printing from class C: 1
Printing from class B: 2
Printing from class A: 3

لذا، من الإخراج يمكننا أن نرى بوضوح أن الدالة __init__() للفئة C قد تم استدعاؤها أولاً، ثم الفئة B وبعد ذلك الفئة A. حدثت نفس الشيء عن طريق استدعاء دالة sub_method().

لماذا نحتاج إلى وظيفة Python super

إذا كان لديك تجربة سابقة في لغة الجافا، فإنك يجب أن تعلم أن الفئة الأساسية تُستدعى أيضًا باستخدام كائن super هناك. لذا، هذا المفهوم فعلاً مفيد للمبرمجين. ومع ذلك، تحتفظ لغة البايثون أيضًا بإمكانية للمبرمج باستخدام اسم الفئة الأم للإشارة إليها. وإذا كان برنامجك يحتوي على توريث متعدد المستويات، فإن وظيفة super() تكون مفيدة بالنسبة لك. إذا، هذا كل شيء عن وظيفة السوبر في لغة البايثون. نأمل أنك قد فهمت هذا الموضوع. يرجى استخدام صندوق التعليقات لأي استفسار.

يمكنك مراجعة النص البرمجي الكامل للبايثون والمزيد من أمثلة البايثون في مستودع GitHub الخاص بنا.

المرجع: التوثيق الرسمي

Source:
https://www.digitalocean.com/community/tutorials/python-super