الجلسة التطبيقية 9: البرمجة الكائنية والوراثة
الجلسة التطبيقية 9 (Recitation 9)
المصادر والنسبة والترخيص
المادة الأصلية: آنا بيل (Ana Bell)، MIT OpenCourseWare (MIT OCW)، معهد ماساتشوستس للتكنولوجيا، مقرر 6.100L: مقدمة في علوم الحاسوب والبرمجة باستخدام Python، خريف 2022 (Fall 2022).
هذه ترجمة وتكييف عربي غير رسمي وفق رخصة CC BY-NC-SA 4.0: النسبة–غير التجاري–المشاركة بالمثل، ولا تعني اعتمادًا أو تأييدًا من MIT أو MIT OCW. شروط الاستخدام والاستشهاد.
منهج الترجمة: لكل عنوان في الملخّص الأصلي عنوان مستقل، وحُفظ ترتيب العناوين والمحاور والتذكيرات والأمثلة كما في الأصل. الشيفرة محفوظة بالإنجليزية، ولم تُترجَم أسماء الدوال ولا الكلمات المفتاحية ولا أسماء المتغيّرات. لم تُضمَّن صور.
ملاحظة المترجم: المصدر ملف Word. يعرض المستند أربعة مقاطع على شكل صور لشيفرة مع تعليقات توضيحية بالأحمر، فنُقلت الشيفرة نفسها نصًّا في مواضعها، وذُكرت التعليقات التوضيحية لكلّ صورة عند موضعها.
المحاضرة المرتبطة
تُرافق هذه الجلسة التطبيقية المحاضرة 20: مثال البرمجة الكينونية الموجّهة بالكائنات — متتبّع اللياقة البدنية (Fitness Tracker Object-Oriented Programming Example). وهي مراجعة للأسبوعين الماضيين، وتغطّي البرمجة الكينونية الموجّهة بالكائنات (OOP) والأصناف (Classes) ودوال الإسناد (Getter and Setter) والوراثة (Inheritance).
تذكيرات (Reminders)
6.100L، الجلسة التطبيقية 9.
- مسابقة MQ9 يوم الاثنين 11/21.
مراجعة الأسبوعين الماضيين
البرمجة الكينونية الموجّهة بالكائنات (Object Oriented Programming)
- تتيح لك الكائنات (objects) تخزين البيانات في بايثون.
- كلّ شيء في بايثون كائن.
- يعرّف الصنف (class) نوعًا من الكائنات.
- حتى الآن رأينا في الصفّ أصناف البناء المدمجة التالية:
intوfloatوstringوlistوtuplesوdictionaries.
- حتى الآن رأينا في الصفّ أصناف البناء المدمجة التالية:
- الكائن نسخة (instance) من صنفه.
- مثلًا: 3 و"hello" و
[1,2,3]كلها نسخ من أصناف.
- مثلًا: 3 و"hello" و
- مزايا البرمجة الكينونية الموجّهة بالكائنات:
- تتيح لك تجميع البيانات في حزم (packages).
- تخفّض تعقيد شيفرتك، فتصير إعادة استخدام الشيفرة سهلة.
- تتيح لك تنفيذ سلوك كلّ صنف واختباره على حدة.
الأصناف (Classes)
- طريقة لإنشاء نوع بيانات خاصّ بك باستخدام أنواع البيانات المدمجة كم لبنات.
- أمثلة من الحياة الواقعية: مصعد، موظف، طابور في محلّ، كعكة فطور…
- السمات (attributes) هي البيانات والإجراءات التي تنتمي إلى الصنف.
- سمات البيانات (Data attributes): الكائنات التي يتكوّن منها الصنف.
- سمات الإجراء (Methods/procedural attributes): دوال لا تعمل إلا مع هذا الصنف.
self:- تشير إلى النسخة التي استُدعيت عليها الدالة.
- وهي دائمًا المعامل الأوّل عند تعريف دالة.
- ولا تُستعمل خارج تعريف الصنف.
- إنشاء صنف:
-
عرّف اسم الصنف.
class Coordinate(object): #define attributes hereملاحظة المترجم: هذا المقطع صورة في الأصل. وتعليقات الصورة بالأحمر: على
classالتعليق «تعريف الصنف»، وعلىCoordinateالتعليق «الاسم/النوع»، وعلىobjectالتعليق «الصنف الأب». -
عرّف سمات الصنف، وعرّف كيف تنشئ نسخة من الصنف باستخدام الدالة
__init__.class Coordinate(object): def __init__(self, x, y): self.x = x self.y = yملاحظة المترجم: هذا المقطع صورة في الأصل. وتعليقات الصورة بالأحمر: على
__init__التعليق «دالة خاصة لإنشاء نسخة، وتحمل شرطتين سفليّتين»، وعلىx, yالتعليق «البيانات التي تهيّئ كائن Coordinate»، وعلىselfالتعليق «معامل للإشارة إلى نسخة من الصنف»، وعلىself.xوself.yالتعليق «سمتا بيانات لكلّ كائن Coordinate». -
عرّف دوال أخرى، ولا يلزم أن تبدأ هذه الدوال بـ
__.- هذه الدوال لا تعمل إلا مع هذا الصنف.
class Coordinate(object): def __init__(self, x, y): self.x = x self.y = y def distance(self, other): x_diff_sq = (self.x-other.x)**2 y_diff_sq = (self.y-other.y)**2 return (x_diff_sq + y_diff_sq)**0.5ملاحظة المترجم: هذا المقطع صورة في الأصل. وتعليقات الصورة بالأحمر: على
selfالتعليق «تستعمله للإشارة إلى أيّ نسخة»، وعلىotherالتعليق «معامل آخر للدالة»، وعلىself.xالتعليق «التدوين بالنقطة للوصول إلى البيانات».
-
استعمال صنف (Using a class)
- أولًا أنشئ نسخة جديدة من الصنف:
# Using the example Coordinate class above
c1 = Coordinate(1,1)
c2 = Coordinate(2,1)
- ثم نفّذ عمليات على النسخ باستعمال دوال الصنف:
c1.distance(c2)
- لكي تستطيع استدعاء
printعلى نسخة من صنفك، عليك تعريف الدالة__str__.- وهناك معاملات خاصّة أخرى (
__len__و__eq__إلخ… ← راجع شرائح المحاضرة للتفصيل).
- وهناك معاملات خاصّة أخرى (
- يمكنك استعمال
isinstance()للتحقّق ممّا إذا كانت النسخة كائنًا من صنف معيّن. - على العموم، يعرّف الصنف التمثيل (representation) والدوال المشتركة بين كلّ نسخ الصنف، في حين الكائن نسخة محدّدة (SPECIFIC instance) من الصنف.
- على العموم، تريد إبقاء التمثيل الداخلي (internal representation) لصنفك مخفيًّا، لمنع الهجمات العدائية (adversarial attacks) والأخطاء.
- التمثيل الداخلي يعني ما هو مكتوب في دالة
__init__.
- التمثيل الداخلي يعني ما هو مكتوب في دالة
- متغيّرات الصنف (class variables): مشتركة بين كلّ أعضاء الصنف.
- تُعرَّف خارج دالة
__init__.
- تُعرَّف خارج دالة
دوال الإسناد (Getter and Setter Methods)
- ينبغي استعمال دوال الإسناد (Getter and Setter) خارج الأصناف للوصول إلى سمات البيانات.
- الوصول إلى السمات بهذه الطريقة هو أسلوب أفضل، ويجعل الشيفرة أسهل في الصيانة ويساعد في منع الأخطاء.
الوراثة والتسلسلات (Inheritance & Hierarchies)
لماذا نستعمل الوراثة؟
- تتيح لك توسيع صنف بقدرات جديدة أو مختلفة.
- تعيد استخدام الشيفرة.
- المشتركات صريحة في الصنف الأب، والفروق صريحة في الصنف الابن.
البنية وكيف تعمل:
- تنشئ علاقة وراثة بين صنفين بأن تعرّف ما يوضع في المعامل ضمن تعريف الصنف.
# Define parent class
class CreditCard(object):
# Define child class:
class RewardCard(CreditCard):
ملاحظة المترجم: هذا المقطع صورة في الأصل، وهي تعرّف الصنف الأب CreditCard ثم الصنف الابن RewardCard.
- الصنف الابن يرث كلّ دوال الصنف الأب.
- يمكننا تعريف دوال جديدة في الصنف الابن لتوسيع السلوك.
- يمكننا إعادة تعريف دوال معرَّفة في الصنف الأب لتعديل السلوك.
- عند استدعاء دالة على نسخة من صنف، يحاول المفسر (interpreter) أن يجد الدالة على مستوى الصنف ثم يفحص الصنف الأب.
- وهذا يعني أنّه إذا عُرِّفت دالتان بالاسم نفسه، فإنّ الدالة في الصنف الابن هي السائدة.