OOP: Python super method - Arabic


المقال هنا موجهة اكتر للمبرمجين بلغة الـ Python لكن بالتأكيد تقدر تستفاد منه.

 

اتكلمناالمقال الفائت عن عيوب الـ Multiple Inheritance, لكن في نفس الوقت مفيش حاجة تمنع استخدامها من قبل مبرمجين آخرين يعني مدام موجودة في اللغة لازم في شخص يستخدمها.

 

المقال الحالي هنتعرف على الـ Super Method الـ وظيفتها الأساسية ضمان الاستدعاء السليم من ترتيب الـ MRO.

 

الكود التالي هعمل Class عادي والـ Inherit هيتم بصورة واضحة ومش هستخدم الـ super Method

 

class A:
   def __init__(self):
       print("I'm Base")
 
class B(A):
   def __init__(self):
       print('I\'m B Class')
       A.__init__(self)
 
class C(A):
   def __init__(self):
       print('i\'m C Class')
       A.__init__(self)
 
class Test(B, C):
   pass

 

لاحظ في الكود: داخل الـ Class B والـ Class C اني استدعيت الـ

 A.__init__(self) 

 

اعمل Execute للكود

 

o = Test()

 

هتلاحظ ان الـ C اتعدت او بمعنى ادق مش تم عمل print للرسالة الـ جواها, لو فاكر او على الاقل كتبت الكود بالمقال الفائت بيدك هتعرف اني ممكن اعمل Override لـ Method في الـ Inheritance زي المثال التالي

 

class Base:
   def greeting(self):
       print('Hello World!!')

class Derived(Base):
   def greeting(self):
       print('Go away')

class LastClass(Derived):
   pass

 

الـ Execution تم في الكود التالي هنا من الـ LastClass للـ Base, وعند استدعاء الـ greeting Method تم Override الـ Method الـ Declared اول مرة داخل الـ Base Class

 

نرجع للكود بتاعنا

 

الترتيب الوراثي (MRO) تم كالتالي:

 

Test, B, C, A Object

 

وبما ان الـ  __init__ موجودة بالـ B والـ C ...  والـ Execution بيتم من الـ Test لحد الـ A Class, بيتم تعديل الـ Method كل مرة, لو احنا هنستخرج الـ MRO بصورة مبسطة هتكون كالتالي, لاحظ موقع الـ C Class:

 

class A:
   def __init__(self):
       print("I'm Base")

class C(A):
   def __init__(self):
       print('i\'m C Class')
       A.__init__(self)

class B(C):
   def __init__(self):
       print('I\'m B Class')
       A.__init__(self)

class Test(B):
   def __init__(self):
       pass

 

اظن كده وصلت ليه تم تجاهل الـ init داخل الـ C Class

 

الـ Super Method بتعمل ايه بقى؟

 

بتستدعي الـ init التالية في الترتيب داخل الـ MRO هاعيد كتابة الكود الاولاني مع اضافة الـ super Method داخل الـ B Class, هتلاقي ان تم استدعاء الـ print من داخل الـ C Class

 

ملاحظة:

** الـ super مش بتاخد self وكذلك الـ Method المستدعاة منها

** الـ super مش بتاخد اي نوع من الـ Arguments

** اي كود مدخل Arguments اعرف ان هي نسخة قديمة من الـ Python

 

# Python > 3.0
super(B, self).__init__()

 

الكود الكامل

 

class A:
    def __init__(self):
        print("I'm Base")

class B(A):
    def __init__(self):
        print('I\'m B Class')
        super().__init__()

class C(A):
    def __init__(self):
        print('i\'m C Class')
        A.__init__(self)

class Test(B, C):
    pass

Test()

 

الـ Output

 

I'm B Class
I'm C Class
I'm Base

 

ده الفرق بين Class مستخدم super

 

class B(A):
    def __init__(self):
        print('I\'m B Class')
        super().__init__()

 

و من غير

 

class B(A):
    def __init__(self):
        print('I\'m B Class')
        A.__init__()

 

يمكن تكون وصلت لحد هنا ومش مستوعب اوي, عادي, انا فضلت 4 ايام قبل ما افهمها.

 

الموضوع كله تراكمي, عشان كده اتاكد انك فهمت المقالات الفائتة واقراء المقال الحالي اكتر من مرة واشتغل على المثال بيدك لحد ما الفكرة توصلك, صدقني حاجة بسيطة زي فهمك للـ Super Method ممكن تفرق معاك جدا سواء في شغل او مقابلة شغل.

 

المقال التالي: Encapsulation

المقال الفائت: Method Resolution Order