ملتقى الواحــة

نسخة كاملة : مدخل الى الفئات (class) في بيثون
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
مدخل الى الفئات (class) في بيثون

رأينا في المواضيع السابقة أهم أنواع الكائنات المدمجة في بيثون: رأينا الانواع العددية: العدد الصحيح int والحقيقي float والمركب complex ورأينا السلاسل النصية str والقوائم list والصفوف tuple والقواميس dict والمجموعات set و frozenset وتعلمنا أن نميز بين القابل للتعديل منها وغير القابل للتعديل وما هو من نوع المتتاليات التي نستطيع الوصول الى عناصرها الفرعية بواسطة المؤشرات وما لا يعتبر من المتتاليات لكن لها مفاتيح فريدة...

لكننا لاحظنا ايضا أننا نستطيع معالجة مختلف هذه الانواع بطريقة متشابهة في الغالب وخاصة عبر len و in و print.

بيثون يذهب أبعد من استخدام الانواع المدمجة فقط، ذلك أننا نستطيع تعريف أنواع خاصة بنا وان نجعلها تتصرف كالانواع المدمجة بالضبط، بمعنى أننا نستطيع بناء انواع جديدة من الكائنات تقبل اختبار الانتماء بواسطة in او تحديد طولها بواسطة len او طباعتها على الشاشة بواسطة print أو التعيين بواسطة القوسين المربعين []...

سنمر بدون اطالة الى الاطلاع على الآليات التي تتيح لنا بناء انواعنا الخاصة او ما يسمى الفئات class. بواسطة الكلاس يمكننا انشاء كائنات وتعريف وظائف تجعل تلك الكائنات تتصرف كما لو أنها من الانواع المدمجة.

نذكر بأن كل شيء في بيثون هو كائن وأن لكل كائن نوعا type وفي الواقع النوع هو الفئة التي 'صنعنا' منها الكائن، يعني النوع او الفئة يعنيان نفس الشيء: الفئة (الكلاس) هي الآلة التي ستصنع الكائن والذي سيكون من نوع الكلاس نفسها. بالمقارنة مع الانواع المدمجة، النوع قائمة مثلا، list هو النوع او الفئة التي سننشئ بها كائنا من نوع قائمة، وكل القوائم هي أمثلة من النوع او الفئة list.

سنستخدم IDLE في موضوعنا هذا. لانشاء كلاس نستخدم التعليمة class

كود :
class C:
   pass        # كلاس لا يفعل شيئا
أحفظ الملف (باسم ClassIntro.py على سبيل المثال ثم أشغله بواسطة المفتاح F5

عندي الآن في مفسر بيثون فئة C يمكنني استدعاؤها بواسطة القوسين (لانشاء مثيل)

كود :
C               # <class '__main__.C'>
C()             # <__main__.C object at 0x7f114bcbe4e0>
c1 = C()        # an instance of C
c2 = C()        # an other instance of C
c1, c2          # (<__main__.C object at 0x7f1154fef9e8>, <__main__.C object at 0x7f114bc90ef0>)
help(c1)
dir(c1)
c1.__str__()
print(c1)
هذه الفئة التي بنيناها لا تحتوي على وظائف، لذلك ليس لها مهام او تصرفات خاصة بها، يعني فئة لا تفعل شيئا.. رغم ذلك ساعدنا نجد العديد من الوظائف الخاصة لكن أكثرها غير معرف او هي معرفة بعمومية كبيرة.. لكي يكون للفئة اهمية علينا أن نحدد لها وظائف. أول تلك الوظائف والتي سيتم استدعاؤها عند انشاء كائن جديد من نوع C (أو بالأحرى عند تهيئة الكائن الجديد) هي الوظيفة __init__

كود :
class Sentence:
   def __init__(self, sentence):
       self.words = sentence.split()
لنتأمل هذه السطور: قمنا بتعرف دالة __init__ داخل الفئة. الدوال (functions) التي نقوم بتعريفها داخل الفئات تسمى وظائف (methods). في مثالنا جعلنا هذه الوظيفة تقبل وسيطين اولهما سميناه self لكي نشير الى الكائن الذي نحن بصدد انشائه بواسطة الكلاس. تمرير وسيط يشير الى الكائن بصدد الانشاء اجباري لكن التسمية self توافقية ويجدر بنا أن نحترمها. الوسيط الثاني sentence من اختيارنا طبعا. انظر كيف نستخدم هذه الوظيفة عند انشاء كائن من نوع Sentence (أحفظ وأنفذ بواسطة F5):

كود :
s = Sentence("Hello I'm learning Python")
s.words
كما ترى أصبح لدى الكائن s من نوع Sentence خاصية تتمثل في تقطيع النص الى كلمات (ذلك النص الذي مررناه كوسيط (argument) عند انشاء الكائن)، وهذه الخاصية لها مرجعية هي السمة (attribut) التي سميناها words

أرغب الآن في مزيد من الوظائف للكائنات من نوع Sentence. يمكنني مثلا تخيل وظيفة تجعل جميع الكلمات بالحروف الكبيرة

كود :
class Sentence:
   def __init__(self, sentence):
       self.words = sentence.split()
   def upper(self):
       self.words = [w.upper() for w in self.words]
أحفظ وجرب

كود :
s = Sentence("Hello I'm learning Python")
s.words         # ['Hello', "I'm", 'learning', 'Python']
s.upper()
s.words         # ['HELLO', "I'M", 'LEARNING', 'PYTHON']
استطاعت الوظيفة المدرجة في المثيل s تعديل سمة من سمات المثيل s

الآن اريد طباعة المثيل عند استخدام الدالة print. حاليا:

كود :
print(s)        # <__main__.Sentence object at 0x7fd54e1e6080>
لكنني اريد مثلا الحصول على الكلمات عند استخدام print

كود :
class Sentence:
   def __init__(self, sentence):
       self.words = sentence.split()
   def upper(self):
       self.words = [w.upper() for w in self.words]
   def __str__(self):
       return "\n".join(self.words)
نحفظ ونجرب من جديد

كود :
s = Sentence("Hello I'm learning Python")
print(s)
هكذا بكل يسر يمكننا تطبيق in عبر الوظيفة __contains__ وعد الكلمات عبر الوظيفة __len__ وهكذا مختلف الوظائف التي نجدها في الانواع المدمجة في لغة بيثون.

كود :
class Sentence:
   def __init__(self, sentence):
       self.words = sentence.split()
   def upper(self):
       self.words = [w.upper() for w in self.words]
   def __str__(self):
       return "\n".join(self.words)
   def __contains__(self, w):
       return w in self.words
   def __len__(self):
       return len(self.words)
ثم نجرب

كود :
s = Sentence("Hello I'm learning Python")
'Python' in s       # True
'Bonjour' in s      # False
len(s)              # 4
هذا الموضوع ليس سوى مقدمة تعرفنا فيها على كيفية بناء فئات وكيفية استخدامها في انشاء كائنات من نوع الفئة التي طورناها كما جعلنا الكائنات تتصرف كما لو أنها من الانواع المدمجة في بيثون عبر استخدام بعض الوظائف الخاصة تلك التي تشبه __xyz__



بعض المفردات التقنية وترجماتها

كائن    =    object

فئة     =    class

وسيط    =    argument

سمة     =    attribut

دالة    =    function

وظيفة   =    method

مرجع    =    reference

مثيل    =    instance

مدمجة   =    built-in



الى اللقاء في موضوع أكثر توسعا