Python: التغليف والوراثة

آخر تحديث: 2026-09-22

التغليف يخفي التفاصيل الداخلية للكائن، ويكشف فقط عن واجهات تشغيل آمنة. الوراثة تسمح لفئة واحدة أن تمتلك تلقائياً وظائف فئة أخرى، متجنبة التكرار. هذان المفهومان هما العمود الفقري للبرمجة كائنية التوجه.


دوال مدمجة ذات صلة:super()

1. التغليف والسمات الخاصة

التغليف يعني أن البيانات الداخلية للكائن لا ينبغي الوصول إليها مباشرة من الخارج — يجب التعامل معها من خلال الطرق.

(1) الشرطة السفلية المفردة _ — اصطلاح للسمات "المحمية"

▶ مثال: الشرطة السفلية المفردة والمزدوجة

▶ جرّب الكود

الناتج:

TEXT 📖 للعرض فقط
# Function defined successfully

الشرطة السفلية المفردة هي مجرد اصطلاح، غير مفروض — لن تمنعك بايثون من الوصول إليها. إنها مثل الكتابة في التوثيق "هذا داخلي، لا تلمسه."

(2) الشرطة السفلية المزدوجة __ — تشويه الاسم

▶ مثال: فئة الحساب البنكي

▶ جرّب الكود

الناتج:

TEXT 📖 للعرض فقط
# Function defined successfully

الشرطة السفلية المزدوجة تُفعّل تشويه الاسم — __balance يُحوّل داخلياً إلى _BankAccount__balance. هذا ليس "خصوصية" حقيقية، فقط يجعل التجاوز العرضي أقل احتمالاً.

💡 بايثون ليس لديها خصوصية حقيقية. تعتمد على فهم "نحن جميعاً بالغون متفقون" — الشرطة السفلية المفردة تعني "استخدام داخلي"، الشرطة السفلية المزدوجة تمنع تضارب الأسماء. اللغات الأخرى (مثل Java) لديها كلمة private حقيقية؛ بايثون لا تملكها ولا تخطط لإضافتها.

▶ مثال: فئة درجة الحرارة (الصعوبة ⭐⭐)

▶ جرّب الكود

الناتج:

TEXT 📖 للعرض فقط
Temperature cannot be below absolute zero!


2. @property: التحكم الأنيق في الوصول

كتابة set_celsius() / get_celsius() مطولة. @property يتيح لك التحكم في الوصول مع الحفاظ على صيغة الوصول إلى السمات:

▶ مثال: استخدام @property

▶ جرّب الكود

الناتج:

TEXT 📖 للعرض فقط
# Function defined successfully
💡 مزايا @property: 1) لا حاجة لأقواس للوصول: t.celsius بدلاً من t.get_celsius(). 2) تحقق تلقائي عند الإسناد: t.celsius = value بدلاً من t.set_celsius(value). 3) يمكن تحويل سمة عادية إلى سمة محسوبة دون كسر الكود الموجود.



3. الوراثة

الوراثة تتيح للفئة الفرعية أن تمتلك جميع سمات وطرق فئتها الأم:

▶ مثال: وراثة الحيوان

▶ جرّب الكود

الناتج:

TEXT 📖 للعرض فقط
# Function defined successfully

(1) super(): استدعاء طرق الأب

▶ مثال: super() لاستدعاء الأب

▶ جرّب الكود

الناتج:

TEXT 📖 للعرض فقط
# Function defined successfully


4. نمط Mixin

Mixin هو فئة خاصة — لا تُستخدم بشكل مستقل، بل "تُخلط" لإضافة وظائف لفئات أخرى:

▶ مثال: نمط Mixin

▶ جرّب الكود

الناتج:

TEXT 📖 للعرض فقط
# Function defined successfully
💡 اصطلاح تسمية Mixin: أسماء الفئات التي تنتهي بـ Mixin تشير إلى أنها للخلط، وليس للاستخدام المستقل. فئة يمكنها خلط عدة Mixins بالإضافة إلى فئة أساسية رئيسية واحدة — أكثر مرونة بكثير من الوراثة الفردية العميقة.



5. حالات الاستخدام الشائعة



دوال مدمجة ذات صلة:super()

❓ أسئلة شائعة

س متى يجب استخدام الوراثة مقابل Mixin؟
ج الوراثة مناسبة لعلاقات "هو" — الكلب هو حيوان. Mixins مناسبة لـ "يمتلك قدرة" — البطة يمكنها السباحة. فضّل التركيب (Mixin) على الوراثة، لأن التسلسلات الهرمية العميقة للوراثة صعبة الصيانة. قاعدة جيدة: الوراثة يجب ألا تتجاوز 3 مستويات.
س ما الفرق بين @property والطريقة العادية؟
ج @property يجعل الطريقة تبدو كسمة — لا حاجة لأقواس للوصول، الإسناد يُفعّل setter. إنها أساساً "معترض سمات" — تكتب كوداً كما لو كنت تتلاعب بسمة، لكن طريقة تُنفّذ فعلياً.
س هل تدعم بايثون الوراثة المتعددة؟ أي مخاطر؟
ج نعم — class C(A, B). ومع ذلك، الوراثة المتعددة لها "مشكلة الماس" (أي طريقة الأب تُستخدم عندما كلاهما لهما نفس الاسم). تستخدم بايثون MRO (ترتيب حل الطريقة)، بالبحث من اليسار إلى اليمين. Mixins هي نمط تصميم يستفيد من الوراثة المتعددة، مع فئات Mixin صغيرة ومستقلة وظيفياً، متجنبة مشاكل الماس.

📖 ملخص


📝 تمارين

  1. مبتدئ (الصعوبة ⭐): عرّف فئة Product مع @property لسمة price — يجب أن تكون موجبة عند التعيين؛ تُرجع القيمة الأصلية عند القراءة.

  2. متوسط (الصعوبة ⭐⭐): عرّف وراثة من ثلاثة مستويات: Animal → Mammal → Dog / Cat. Animal لها name و age؛ Mammal تضيف fur_color؛ Dog و Cat كل منهما تنفذ طريقة speak() الخاصة بها.

  3. متقدم (الصعوبة ⭐⭐⭐): أنشئ نظام تسجيل باستخدام LoggableMixin (يوفر طرق log_info()، log_error()) وفئة أساسية Application (لها سمة name). اجعل WebApp و CLIApp كلتاهما ترث من Application وتخلط LoggableMixin لتنفيذ وظيفة التسجيل.

Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%