30-05-2018, 01:43 AM
مدخل الى الفئات (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 # كلاس لا يفعل شيئا
عندي الآن في مفسر بيثون فئة 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)
كود :
class Sentence:
def __init__(self, sentence):
self.words = sentence.split()
كود :
s = Sentence("Hello I'm learning Python")
s.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']
الآن اريد طباعة المثيل عند استخدام الدالة print. حاليا:
كود :
print(s) # <__main__.Sentence object at 0x7fd54e1e6080>
كود :
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)
كود :
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
بعض المفردات التقنية وترجماتها
كائن = object
فئة = class
وسيط = argument
سمة = attribut
دالة = function
وظيفة = method
مرجع = reference
مثيل = instance
مدمجة = built-in
الى اللقاء في موضوع أكثر توسعا