دالة ()super
جزء من قسم Object Oriented Programming في رحلة Python على Coddy — الدرس 18 من 64.
تسمح الدالة super() للفئة الفرعية (child class) باستدعاء دوال من فئتها الأصلية (parent class). يتيح لك ذلك توسيع وظائف الفئة الأصلية بدلاً من استبدالها بالكامل.
إليك مثال على استخدام super() في المُنشئ (constructor):
class Animal:
def __init__(self, name):
self.name = name
print(f"Animal created: {name}")
class Dog(Animal):
def __init__(self, name, breed):
super().__init__(name) # استدعاء __init__ الخاص بالفئة الأب
self.breed = breed
print(f"Dog breed set: {breed}")أنشئ كائن كلب:
buddy = Dog("Buddy", "Golden Retriever")
print(f"Name: {buddy.name}, Breed: {buddy.breed}")المخرجات:
Animal created: Buddy
Dog breed set: Golden Retriever
Name: Buddy, Breed: Golden Retrieverاستخدم super() لتوسيع دوال الفئة الأب (parent methods):
class Animal:
def make_sound(self):
print("Generic animal sound")
class Dog(Animal):
def make_sound(self):
super().make_sound() # استدعاء دالة الفئة الأب أولاً
print("Woof!") # إضافة سلوك خاص بالكلباستدعِ الطريقة الموسعة:
buddy = Dog()
buddy.make_sound()المخرجات:
Generic animal sound
Woof!بدون super()، ستفقد وظائف الفئة الأب:
class Cat(Animal):
def make_sound(self):
print("Meow!") # صوت القطة فقط، تم تجاهل طريقة الفئة الأب
cat = Cat()
cat.make_sound()المخرجات:
Meow!نقطة رئيسية: استخدم super() لاستدعاء دوال الفئة الأب (parent class) من الفئات الأبناء (child classes). يتيح لك ذلك توسيع الوظائف بدلاً من استبدالها بالكامل. تشمل الاستخدامات الشائعة استدعاء دوال __init__ الخاصة بالأب وتوسيع سلوك الأب.
التحدي
متوسطفي هذا التحدي، ستقوم بتنفيذ هيكلية فئات Person و Employee باستخدام الوراثة.
person.py: يحتوي على فئة Person مع سمات name و ageemployee.py: يحتوي على فئة Employee التي ترث من Persondriver.py: الملف الرئيسي لاختبار تنفيذك
يحتوي كل ملف على تعليقات TODO مفصلة لإرشادك خلال التنفيذ.
ورقة مرجعية
تسمح دالة super() للفئة الفرعية (child class) باستدعاء دوال من فئتها الأصلية (parent class)، مما يؤدي إلى توسيع الوظائف بدلاً من استبدالها.
استخدام super() في الدوال الإنشائية (constructors):
class Animal:
def __init__(self, name):
self.name = name
class Dog(Animal):
def __init__(self, name, breed):
super().__init__(name) # استدعاء __init__ الخاصة بالفئة الأصلية
self.breed = breedاستخدام super() لتوسيع الدوال:
class Animal:
def make_sound(self):
print("Generic animal sound")
class Dog(Animal):
def make_sound(self):
super().make_sound() # استدعاء دالة الفئة الأصلية أولاً
print("Woof!") # إضافة سلوك خاص بالفئة الفرعيةبدون super(): تقوم دوال الفئة الفرعية باستبدال وظائف الفئة الأصلية تماماً بدلاً من توسيعها.
جرّب بنفسك
# TODO: استيراد فئة Person من person.py
# TODO: استيراد فئة Employee من employee.py
def main():
# TODO: إنشاء كائن Person باسم "Alice" وعمر 30
person = None
# TODO: إنشاء كائن Employee باسم "Bob" وعمر 35 ووظيفة "Developer"
employee = None
# TODO: استدعاء طريقة introduce() على كائن Person
# المخرجات المتوقعة: "Hi, I'm Alice and I'm 30 years old"
# TODO: طباعة سطر فارغ للمسافة - print()
# TODO: استدعاء طريقة introduce() على كائن Employee
# المخرجات المتوقعة:
# "Hi, I'm Bob and I'm 35 years old"
# "I work as a Developer"
if __name__ == "__main__":
main()يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Object Oriented Programming
1أساسيات OOP
الملفات الخارجيةمقدمة في OOPClasses مقابل Objectsمعامل selfMethodsAttributesدالة البناء (__init__)مراجعة - آلة حاسبة بسيطة4الوراثة
الوراثة الأساسيةدالة ()superإعادة تعريف الدوال (Method Overriding)الوراثة المتعددةترتيب استدعاء الدوال (Method Resolution Order)مراجعة - هيكلية الموظفين5تعدد الأشكال
مراجعة إعادة تعريف الدوالمفهوم Duck Typingالأصناف والدوال المجردةتصميم الواجهاتملخص - حاسبة الأشكال