القائمة الرئيسية

الصفحات

البرمجة الشيئية في بيثون / الفئات Programmation orientée objet en python / classes

البرمجة الشيئية في بيثون / الفئات 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()



الصفحة الرئيسية >> مكررات الديكور ومولدات بايثون Les décorateurs Les itérateurs et les générateurs python     

تعليقات