0Pricing
Python Academy · درس

تجاوز الطرق وsuper()

تجاوز طرق الفئة الأصل واستدعها باستخدام super()

تجاوز الطرق وsuper() درس مجاني في Python Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Python Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Python Academy 4 دروس في المجموع.

مقدمة

تتيح إعادة تعريف الطرق للفئات الابنة تخصيص السلوك الموروث. ويتيح super() استدعاء التنفيذ الأصلي.

أساسيات إعادة التعريف

عرّف اسم الطريقة نفسه في الفئة الابنة لاستبدال إصدار الفئة الأب لجميع مثيلات الفئة الابنة.
class Greeter:
    def greet(self): return 'Hello'
class FormalGreeter(Greeter):
    def greet(self): return 'Good day'
print(FormalGreeter().greet())

super() في الطرق المعاد تعريفها

يستدعي super().greet() داخل الفئة الابنة إصدار الفئة الأب. وهذا مفيد لتوسيع السلوك، لا لاستبداله بالكامل.
class Logger:
    def log(self, msg): print(f'[LOG] {msg}')
class TimedLogger(Logger):
    def log(self, msg):
        import time
        super().log(f'{time.time():.0f}: {msg}')
TimedLogger().log('test')

super() في __init__

استدعِ دائمًا super().__init__() داخل __init__ الخاصة بالفئة الابنة لضمان تشغيل تهيئة الفئة الأب.
class Animal:
    def __init__(self, name): self.name = name
class Cat(Animal):
    def __init__(self, name, indoor):
        super().__init__(name)
        self.indoor = indoor
cat = Cat('Whiskers', True)
print(cat.name, cat.indoor)

super() مع الوسائط

يُعد super(ChildClass, self) الصيغة الصريحة (وفق أسلوب Python 2). وتسمح Python 3 باستخدام super() دون وسائط في معظم الحالات.
class A:
    def greet(self): return 'A'
class B(A):
    def greet(self): return super().greet() + 'B'
class C(B):
    def greet(self): return super().greet() + 'C'
print(C().greet())

الوراثة التعاونية

في الوراثة المتعددة، يتبع super() ترتيب تحليل الطريقة MRO. ويضمن استدعاء كل فئة لـ super() تهيئة جميع الفئات في السلسلة.
class A:
    def __init__(self): print('A init')
class B(A):
    def __init__(self): super().__init__(); print('B init')
class C(A):
    def __init__(self): super().__init__(); print('C init')
class D(B, C):
    def __init__(self): super().__init__(); print('D init')
D()

إعادة تعريف __str__

أعد تعريف __str__ في الفئة الابنة لتخصيص طريقة طباعة المثيلات.
class Animal:
    def __init__(self, name): self.name = name
    def __str__(self): return f'Animal: {self.name}'
class Dog(Animal):
    def __str__(self): return f'Dog: {self.name}'
print(Dog('Rex'))

نمط طريقة القالب

تعرّف الفئة الأب الهيكل العام للخوارزمية، وتملأ الفئة الابنة الخطوات بإعادة تعريف طرق محددة.
class DataProcessor:
    def process(self):
        data = self.load()
        return self.transform(data)
    def load(self): return [1,2,3]
    def transform(self, d): return d
class Doubler(DataProcessor):
    def transform(self, d): return [x*2 for x in d]
print(Doubler().process())

استدعاء طريقة فئة شقيقة

باستخدام super() وترتيب MRO صحيح، يمكنك استدعاء طريقة فئة شقيقة في الوراثة المتعددة؛ وهذا هو super() التعاوني.
class A:
    def hello(self): print('A')
class B(A):
    def hello(self): super().hello(); print('B')
class C(A):
    def hello(self): super().hello(); print('C')
class D(B,C):
    def hello(self): super().hello(); print('D')
D().hello()

__init_subclass__

يُستدعى __init_subclass__ كلما أصبحت الفئة فئةً فرعية. وهو مفيد في أنماط تسجيل الإضافات.
class Plugin:
    registry = []
    def __init_subclass__(cls, **kw):
        super().__init_subclass__(**kw)
        Plugin.registry.append(cls)
class A(Plugin): pass
class B(Plugin): pass
print([c.__name__ for c in Plugin.registry])

متى لا تعيد التعريف

لا تُعد التعريف إذا لم تكن بحاجة إلى تغيير السلوك. تؤدي عمليات إعادة التعريف غير الضرورية إلى زيادة عبء الصيانة. وفّضّل التركيب للسلوك غير المرتبط.
# Good: only override what's needed
class Dog(Animal):
    def speak(self): return 'Woof'
    # No need to override __init__ if parent's is fine
print('override guidance')

تحقق سريع

في Python 3، إلى ماذا تشير super() (دون وسائط) داخل طريقة؟

مراجعة

أعد التعريف بإعادة التصريح داخل الفئة الابنة. يستدعي super().method() إصدار الفئة الأب. تهيّئ super().__init__() الفئة الأب. ويتبع super() التعاوني ترتيب MRO.

واصل التقدم

تقدّم ممتاز! تابع التقدم لإتقان المفهوم التالي.

الأسئلة الشائعة

هل درس «تجاوز الطرق وsuper()» مجاني؟

نعم — نص درس «تجاوز الطرق وsuper()» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Python Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Python Academy 4 دروس في المجموع.

ماذا ستتعلم في «تجاوز الطرق وsuper()»؟

تجاوز طرق الفئة الأصل واستدعها باستخدام super() تتمرن على Python Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Python Academy؟

لا تُشترط خبرة سابقة. Python Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «تجاوز الطرق وsuper()»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Python Academy هذا؟

نعم. كل درس في Python Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. الوراثة الأحادية
  2. تجاوز الطرق وsuper()
  3. الوراثة المتعددة وMRO
  4. تعدد الأشكال والكتابة بأسلوب البطة
← العودة إلى Python Academy