البرمجة الشيئية في بيثون / الفئات Programmation orientée objet en python / classes
تتيح لك البرمجة الشيئية (OOP) إنشاء كيانات (كائنات) يمكن معالجتها. تتطلب البرمجة الشيئية هياكل صلبة وواضحة. يمكن أن
تتفاعل الكائنات مع بعضها البعض ، مما يسهل فهم الكود وصيانته. غالبا ما تتناقض برمجة الكائنات مع البرمجة الإجرائية ، حيث تكون الأولى
أكثر "احترافية" من الأخرى لأنها أكثر موثوقية ونظافة .
فئات Les classes
الفئة هي مجموعة من
الوظائف والسمات التي تحدد كائنا. تسمى وظائف الفصل أيضا "الأساليب ".
لنقم بإنشاء فئة Voiture :
# coding: utf - 8
class car :
def _init_(self):
self.nom = " bmw "
فئة "اvoiture:
" لدينا هي
نوع من المصانع لإنشاء السيارات.
يتم استدعاء الأسلوب __init__() عند إنشاء كائن.
Self.nom هي طريقة لتخزين المعلومات في الفصل الدراسي.
وهذا ما يسمى سمة الفئة. في حالتنا ، نقوم بتخزين الاسم في سمة nom .
الكائنات Les objets
الكائن هو مثيل لفئة. يمكنك إنشاء العديد من الكائنات كما تريد مع فئة دراسية.
الآن دعونا نخلق voiture:
>>> ma_car = car ()
سمات الفئة Les attributs de classe
تستخدم سمات الفئة لتخزين المعلومات على مستوى الفصل.
إنها تشبه المتغيرات.
Dans notre exemple :
>>> ma_car = car()
>>> ma_car.nom
'bmw'
يمكنك إنشاء سمة للكائن في أي وقت:
>>> ma_car.modele = "25"
واقرأها بهذه الطريقة:
>>> ma_car.modele
'25'
أساليب Les méthodes
الأساليب هي وظائف محددة في فئة.
دعنا ننشئ طريقة جديدة في فئة سياراتنا :
# coding: utf - 8
class car :
def _init_(self):
self.nom = " bmw "
def donne__moi__le__modele( self
) :
return "25"
استخدم هذه الطريقة:
>>> ma_car=car()
>>> ma_car.donne__moi__le__modele( )
'25'
خصائص Les propriétés
مهما كانت اللغة ، بالنسبة للبرمجة الموجهة للكائنات ، من الأفضل المرور عبر الخصائص لتغيير قيم السمات. لذلك على
الرغم من أنه ليس إلزاميا ، إلا أن هناك اتفاقية للذهاب من خلال getter (أو accessor باللغة الفرنسية) و setter (mutators) لتغيير قيمة
السمة. هذا يحافظ على الاتساق للمبرمج ، إذا قمت بتغيير سمة في كثير من الأحيان
يمكن أن تؤثر أيضا على السمات الأخرى وتسمح الطفرات بإجراء هذا التغيير مرة واحدة
وإلى الأبد.
مثال على استخدام الخصائص:
# coding: utf – 8
class car(object):
def _init_( self ):
self._porte=4
def _get_porte(self):
print " Récupération du
nombre de portes "
return self._porte
def _set_porte(self, w):
print " Changement du
nombre de portes "
self._portes = w
porte=property(_get__porte , __set__portes
)
عند تغيير قيمة عدد العجلات ، ستظهر رسالة. في حد ذاته
لا يجلب أي شيء ولكن بدلا من إجراء طباعة بسيطة ، يمكنك على سبيل المثال إرسال بريد إلكتروني ، إلخ .
دعنا نختبر فصلنا :
>>> ma_car = Car()
>>> ma_car.porte=5
Changement du nombre de portes
>>> ma_car.porte
Recuperation du nombre de portes
5
هناك بناء جملة آخر عند المرور عبر الديكور :
class Car(object):
def _init_(self):
self._porte = 4
@property
def portes(self):
print "Recuperation du
nombre de portes "
return self._portes
@roues.setter
def portes(self, w ):
print " Changement du
nombre de portes "
self._portes = w
ستكون النتيجة هي نفسها ، ولكن تم تحسين قراءة الكود .
وظيفة دير La fonction dir
في بعض الأحيان يكون من المثير للاهتمام تشريح كائن لحل
خطأ أو لفهم برنامج نصي.
تمنحك الدالة dir نظرة عامة على طرق الكائن :
>>> dir(ma_car)
[ ' _doc_ ', ' _init_ ', '_module_',
'donne__moi__le__modele', 'nom']
attribute__dict__ الخاصة L'attribut spécial __dict__
تمنحك هذه السمة
الخاصة قيم سمات المثيل:
>>> ma_car.__dict__
{'nom': 'bmw '}
التراث الطبقي L'héritage
de classe
الميراث مفهوم مفيد للغاية. هذا يجعل من الممكن إنشاء
فئات جديدة ولكن مع قاعدة موجودة.
دعونا نحافظ على مثال السيارة وننشئ فئةVoitureSport :
class Car:
portes = 4
moteur = 1
def __init__(self):
self.nom = " a determiner"
class VoitureSport(Car):
def __init__(self):
self.nom = "bmw "
تم الإبلاغ عن ذلك CarSport قد ورثت فئة السيارة ، لذلك
تستعيد جميع أساليبها وسماتها .
يمكنك دائما إنشاء فئة السيارة إذا كنت ترغب في ذلك :
>>> ma_car=Car()
>>> ma_car.nom
' a determiner'
>>> ma_car.porte
4
الآن دعنا نجعل فئة السيارات الرياضية نمثلها:
>>> ma_car_sport=CarSport()
>>> ma_car_sport.nom
'bmw '
>>> ma_car_sport.portes
4
بادئ ذي بدء ، نلاحظ أن سمة العجلة موروثة. ثم نلاحظ أن طريقة __init__ حلت محل طريقة فئة السيارة.
وهذا ما يسمى طريقة الزائد.
تعدد الأشكال / طريقة الزائد Polymorphisme
/ surcharge de méthode
كما رأينا أعلاه ، إذا ورثت فئة من فئة أخرى ، فإنها ترث الأساليب من أصلها.
مثل:
# coding: utf - 8
class Care :
portes = 4
moteur = 1
def _init_( self ) :
self.nom = " a determiner
"
def allumer( self ) :
print " voiture demarre "
class VoitureSport(Car):
def __init__(self):
self.nom = " bmw "
ma_car_sport = CarSport()
ma_car_sport.allumer()
النتيجة:
voiture demarre
ومع ذلك ، من الممكن الكتابة فوق أسلوب الفئة الأصل
عن طريق إعادة تعريفه. وهذا ما يسمى التحميل الزائد لطريقة .
# coding: utf - 8
class Car :
portes = 4
moteur = 1
def _init_( self ):
self.nom = " a déterminer
"
def allumer( self ) :
print " voiture demarre"
class CarSport(Car):
def _init_( self ):
self.nom = " bmw "
def allumer(self):
print " voiture sport demarre"
ma_car_sport = CarSport()
ma_car_sport.allumer()
النتيجة:
voiture sport demarre
أخيرا نقطة أخيرة مثيرة للاهتمام: من الممكن استدعاء
طريقة الوالد ثم جعل خصوصية الطريقة. يمكننا أيضا استدعاء أي طريقة أخرى.
# coding: utf - 8
class Car :
portes = 4
moteur = 1
def _init_(self):
self.nom = " a déterminer
"
def allumer(self):
print " voiture demarre "
class CarSport(Car):
def _init_(self):
self.nom = " bmw "
def allumer( self ):
Car.allumer(self)
print " voiture sport demarre
"
ma_car_sport = CarSport()
ma_car_sport.allumer()
النتيجة :
voiture demarre
voiture sport demarre
لذلك فإن كل من فئتي Car و CarSport لها طريقة تحمل نفس الاسم ، لكن هذه الطرق لا تؤدي نفس
المهام. في هذه الحالة نتحدث عن تعدد الأشكال .
الاتفاقيات Conventions
اجعل من المعتاد تسمية فصلك فقط بأحرف أبجدية رقمية
والبدء بحرف كبير. وعلى العكس من ذلك ، يمكن تسمية المثيل بدون كتابة بالأحرف
الكبيرة.
car_sport = CarSport()
تعليقات
إرسال تعليق