مفهوم ال overriding في بايثون
الـ Overriding في بايثون يشير إلى تعديل أو استبدال نمط سلوك معيّن لدالة موروثة من الفئة الأساسية (الأب) في فئة مشتقة (الابن). وهذا يتيح للمبرمج إعادة تعريف دالة معينة من الفئة الأساسية بشكل مختلف في الفئة المشتقة.
لتطبيق overriding في بايثون، يجب تعريف الدالة في الفئة المشتقة بنفس الاسم والتوقيع (signature) كما هو موجود في الفئة الأساسية، ويمكن اضافة المزيد من السلوك الجديد داخل الدالة المعدّلة. عند استدعاء الدالة من الكائن المشتق، سيتم استدعاء التعريف المعدّل في الفئة المشتقة بدلاً من التعريف في الفئة الأساسية.
فيما يلي مثال بسيط يوضح مفهوم overriding:
class A:
def my_func(self):
print("Hello from class A")
class B(A):
def my_func(self):
print("Hello from class B")
obj_a = A()
obj_b = B()
obj_a.my_func() # Output: "Hello from class A"
obj_b.my_func() # Output: "Hello from class B"
في هذا المثال، تم تعريف الدالة my_func في الفئة A وتم استخدامها كنمط سلوك للفئة. ثم تم تعريف الفئة B التي ترث من A ولكن تستبدل دالة my_func بتعريف جديد. عند استدعاء my_func على كائن obj_a الذي ينتمي إلى الفئة A ، يتم طباعة "Hello from class A". أما عند استدعاء my_func على كائن obj_b الذي ينتمي إلى الفئة B ، يتم طباعة "Hello from class B" بدلاً من نمط السلوك الأصلي في الفئة الأساسية.
امثله علئ ال overriding في بايثون
في بايثون، يمكنك القيام بالـ overriding عن طريق إعادة تعريف الدالة في الفصل المشتق. وهذا مثال بسيط:
class Animal:
def sound(self):
print("Unknown sound")
class Cat(Animal):
def sound(self):
print("Meow")
class Dog(Animal):
def sound(self):
print("Woof")
cat = Cat()
dog = Dog()
cat.sound() # Output: Meow
dog.sound() # Output: Woof
في هذا المثال، قمنا بإنشاء فئة Animal التي تحتوي على دالة sound() التي تطبع "Unknown sound". ثم قمنا بإنشاء فصول جديدة Cat و Dog المشتقة من Animal . وفي كل فصل، أعدنا تعريف الدالة sound() لتطبع صوت الحيوان المناسب.
عند استدعاء الأسلوب sound() على كائنات Cat و Dog ، سيتم تشغيل الإصدار المناسب للدالة sound() المعرف في كل فئة مشتقة، نتيجةً يتم طباعة "Meow" لكائن cat و "Woof" لكائن dog .
الداله super()
الدالة super() هي دالة مدمجة في Python تستخدم للوصول إلى الأسلوب (method) الذي يأتي من فئة أساسية (base class) في التراث (inheritance) الخاص بالكائن المحدد.
عند استخدام التوريث في Python، قد يكون لديك عدة فئات تفيد من بعضها البعض. عند كتابة أسلوب جديد في الفئة المشتقة (derived class)، يمكن استخدام super() للوصول إلى نفس الأسلوب في الفئة الأساسية وتنفيذه داخل الأسلوب الجديد. وهذا يزود الكود بمرونة أكبر ويمكّن الأسلوب الجديد من احتواء مزيدٍ من السلوك.
في الإصدارات الحديثة من Python، يمكن استخدام super() بدون أية معاملات، حيث تقوم Python تلقائيًا بتحديد الفئة الأساسية والأسلوب المطلوب وفقًا للسياق الذي يتم استخدام super() فيه.
امثله على دالة super()
في Python، يُمكن استخدام دالة super() للوصول إلى الأسلوب (Method) في الفئة الأساسية (Parent Class) بدلاً من استخدام اسم الفئة الأساسية مباشرةً. وهذا يحدث بشكل خاص في حالة وجود توريث (Inheritance) بين الفئتين.
فيما يلي مثالٌ يوضح استخدام دالة super() :
class Parent:
def __init__(self, name):
self.name = name
class Child(Parent):
def __init__(self, name, age):
super().__init__(name)
self.age = age
في المثال أعلاه، يتم استخدام super() في الأسلوب __init__() في الفئة الفرعية Child للوصول إلى الأسلوب __init__() في الفئة الأساسية Parent وتمرير المعاملات اللازمة لإنشاء الكائن.