Python: التغليف والوراثة
آخر تحديث: 2026-09-22
التغليف يخفي التفاصيل الداخلية للكائن، ويكشف فقط عن واجهات تشغيل آمنة. الوراثة تسمح لفئة واحدة أن تمتلك تلقائياً وظائف فئة أخرى، متجنبة التكرار. هذان المفهومان هما العمود الفقري للبرمجة كائنية التوجه.
1. التغليف والسمات الخاصة
التغليف يعني أن البيانات الداخلية للكائن لا ينبغي الوصول إليها مباشرة من الخارج — يجب التعامل معها من خلال الطرق.
(1) الشرطة السفلية المفردة _ — اصطلاح للسمات "المحمية"
▶ مثال: الشرطة السفلية المفردة والمزدوجة
▶ جرّب الكودالناتج:
# Function defined successfully
الشرطة السفلية المفردة هي مجرد اصطلاح، غير مفروض — لن تمنعك بايثون من الوصول إليها. إنها مثل الكتابة في التوثيق "هذا داخلي، لا تلمسه."
(2) الشرطة السفلية المزدوجة __ — تشويه الاسم
▶ مثال: فئة الحساب البنكي
▶ جرّب الكودالناتج:
# Function defined successfully
الشرطة السفلية المزدوجة تُفعّل تشويه الاسم — __balance يُحوّل داخلياً إلى _BankAccount__balance. هذا ليس "خصوصية" حقيقية، فقط يجعل التجاوز العرضي أقل احتمالاً.
private حقيقية؛ بايثون لا تملكها ولا تخطط لإضافتها.
▶ مثال: فئة درجة الحرارة (الصعوبة ⭐⭐)
▶ جرّب الكودالناتج:
Temperature cannot be below absolute zero!
2. @property: التحكم الأنيق في الوصول
كتابة set_celsius() / get_celsius() مطولة. @property يتيح لك التحكم في الوصول مع الحفاظ على صيغة الوصول إلى السمات:
▶ مثال: استخدام @property
▶ جرّب الكودالناتج:
# Function defined successfully
@property: 1) لا حاجة لأقواس للوصول: t.celsius بدلاً من t.get_celsius(). 2) تحقق تلقائي عند الإسناد: t.celsius = value بدلاً من t.set_celsius(value). 3) يمكن تحويل سمة عادية إلى سمة محسوبة دون كسر الكود الموجود.
3. الوراثة
الوراثة تتيح للفئة الفرعية أن تمتلك جميع سمات وطرق فئتها الأم:
▶ مثال: وراثة الحيوان
▶ جرّب الكودالناتج:
# Function defined successfully
(1) super(): استدعاء طرق الأب
▶ مثال: super() لاستدعاء الأب
▶ جرّب الكودالناتج:
# Function defined successfully
4. نمط Mixin
Mixin هو فئة خاصة — لا تُستخدم بشكل مستقل، بل "تُخلط" لإضافة وظائف لفئات أخرى:
▶ مثال: نمط Mixin
▶ جرّب الكودالناتج:
# Function defined successfully
Mixin تشير إلى أنها للخلط، وليس للاستخدام المستقل. فئة يمكنها خلط عدة Mixins بالإضافة إلى فئة أساسية رئيسية واحدة — أكثر مرونة بكثير من الوراثة الفردية العميقة.
5. حالات الاستخدام الشائعة
- التحقق من صحة البيانات: استخدم
@property.setterلضمان صحة البيانات عند الإسناد. - سمات للقراءة فقط: استخدم
@propertyبدون setter للسمات للقراءة فقط. - إعادة استخدام الكود: ضع الوظائف المشتركة في الفئة الأساسية؛ الفئات الفرعية تكتب فقط الاختلافات.
- التركيب الوظيفي: استخدم Mixins لإضافة ميزات بمرونة إلى فئات مختلفة.
❓ أسئلة شائعة
@property والطريقة العادية؟@property يجعل الطريقة تبدو كسمة — لا حاجة لأقواس للوصول، الإسناد يُفعّل setter. إنها أساساً "معترض سمات" — تكتب كوداً كما لو كنت تتلاعب بسمة، لكن طريقة تُنفّذ فعلياً.class C(A, B). ومع ذلك، الوراثة المتعددة لها "مشكلة الماس" (أي طريقة الأب تُستخدم عندما كلاهما لهما نفس الاسم). تستخدم بايثون MRO (ترتيب حل الطريقة)، بالبحث من اليسار إلى اليمين. Mixins هي نمط تصميم يستفيد من الوراثة المتعددة، مع فئات Mixin صغيرة ومستقلة وظيفياً، متجنبة مشاكل الماس.📖 ملخص
- التغليف:
_تعني "لا تلمس"؛__تُفعّل تشويه الاسم؛@propertyيوفر تحكماً أنيقاً في الوصول - الوراثة: الفئات الفرعية تمتلك تلقائياً سمات وطرق الأب؛
super()تستدعي طرق الأب - تجاوز الطريقة: الفئة الفرعية تعيد تعريف طريقة بنفس اسم الأب
- Mixin: استخدم الوراثة المتعددة لإضافة وظائف بمرونة؛ أفضل من الوراثة العميقة
- بايثون ليس لديها سمات خاصة حقيقية — تعتمد على الاصطلاح وتشويه الاسم
📝 تمارين
-
مبتدئ (الصعوبة ⭐): عرّف فئة
Productمع@propertyلسمةprice— يجب أن تكون موجبة عند التعيين؛ تُرجع القيمة الأصلية عند القراءة. -
متوسط (الصعوبة ⭐⭐): عرّف وراثة من ثلاثة مستويات:
Animal→Mammal→Dog/Cat.Animalلهاnameوage؛Mammalتضيفfur_color؛DogوCatكل منهما تنفذ طريقةspeak()الخاصة بها. -
متقدم (الصعوبة ⭐⭐⭐): أنشئ نظام تسجيل باستخدام
LoggableMixin(يوفر طرقlog_info()،log_error()) وفئة أساسيةApplication(لها سمةname). اجعلWebAppوCLIAppكلتاهما ترث منApplicationوتخلطLoggableMixinلتنفيذ وظيفة التسجيل.