مفهوم الكلاس في بايثون
الكلاس ( Class ) هو عبارة عن حاوية تستطيع أن تضع بداخل هذه الحاوية متغيرات و مصفوفات و دوال إلخ... و من أجل تعريف كلاس جديد نكتب كلمة class ثم نضع له إسم و يجب أن يبدأ إسم الكلاس بحرف كبير لتمييزه ثم نضع نقطتين.
مثال 1
class Age: x = 28
قمنا بإنشاء كلاس إسمه Age ثم أنشأنا متغير x و قيمته 28.
مثال 2
قم بإنشاء كلاس Class بسيط بإسم MyCs قيمة x تكون 5.
class MyCs: x = 5
الكائن object في بايثون
الكائن ( object ) هو عبارة عن نسخة من الكلاس, و لإنشاء نسخة من كلاس معين نقوم بتعريف متغير قيمته تساوي إسم الكلاس ثم نضع قوسين. و يتكون هذا الكائن من دوال methods. هذا الكائن تندرج تحته الدوال ممكن أن نكتب اكثر من دالة و نعمل لها تضمين include وتحت الكائن تبقى وظيفته أنه مسؤول عن هذه الدوال و بدل إستدعاء كل دالة لوحدها نستدعي الكائن في الدوال الذي به كلها.
مثال 3
أنشئ كائن بإسم pt و طباعة قيمة x من الكلاس السابق.
pt = MyCs() print(pt.x)
مثال 4
>>>class Info: def name (self): return "hello world" def age (self): return 26 >>>c = Info() >>>c.name() 'hello world' >>>c.age() '26'
في المثال السابق انشأنا كلاس إسمه Info اسم الكلاس يجب ان يبدأ بحرف كبير حصراً للتميز, و أنشأنا دالة إسمها name و أعطينا قيمة تقوم بإرجاعها هي hello world, و انشأنا دالة أخرى إسمها age و ترجّع لنا قيمة 26.
كلمة return تكون بمثابة دالة الطباعة print و هي ترجّع لنا القيمة المحددة, و انشأنا مُتغير إسمه c و عيننا له قيمة الكلاس Info و بعدها إستدعينا الدوال التي داخل الكلاس عن طريق المتغير c الذي انشأناه.
هذا في شل البايثون وضعنا return للميثود في مثالنا السابق, أما إذا كان ملف محفوظ نقوم بإستبدالها في print و نكتب جميع الطلبات وبعدها نعطي run لكي يطبع لنا الناتج.
الكلمة self في بايثون
بايثون تُجبرك عند تعريف دالة في داخل كلاس على وضع كلمة self أو أي كلمة أخرى كأول باراميتر فيها, و من ثم وضع العدد الذي تريده من الباراميترات, حتى لو لم تكن تنوي أن تضع في هذه الدالة أي باراميتر فإنك مُجبَر على كتابة كلمة self أو أي كلمة آخرى كباراميتر.
فإن أغلب المبرمجين يضعون كلمة self كأول باراميتر في الدالة فمن الأفضل أن تستخدمها أيضاً حتى تكون تعمل بنفس الطريقة التي يعمل بها أغلب المبرمجين حول العالم.
إن سبب وضع كلمة self كأول باراميتر في الدالة يجعل مفسّر بايثون قادر على الوصول إلى الخصائص الموجودة في نفس الكلاس أي تكون مؤشر للكلاس.
مثال 5
class Comparison: def print_max(self, a, b): if a > b: print(a, 'is bigger') elif a < b: print(b, 'is bigger') else: print('They are equal') comparison = Comparison() comparison.print_max(4, 9)
قمنا بإنشاء كلاس إسمه Comparison و وضعنا فيه دالة كان إسمها print_max و يوجد فيها باراميترين ( a و b ) و لاحظوا أننا كنا مجبرين على وضع self كأول باراميتر في الدالة حتى و إن لم نكن بحاجتها و عند إستدعاء الدالة لا نلقي لها بالاً.
و عند تشغيل هذا الكود سوف يطبع لنا النتيجة 9 لأنها أكبر من 4.
9 is bigger
الدالة __init__()
دالة __init__ يجب تعريفها تماماً مثل أي دالة نقوم بتعريفها و بين أقواس الدالة يمكن مباشرتاً تمرير أسماء الخصائص التي نريد وضعها في الكلاس و نريد إعطاءها قيم أولية مباشرةً عند إنشاء كائنات من الكلاس.
مثال 6
أنشئ كلاس بإسم Cs و استخدم فيه الدالة __init__() لتعيين قيم للأسم و العمر.
class Cs: def __init__(self, name, age): self.name = name self.age = age pt = Cs("Saja", 25) print(pt.name) print(pt.age)
الكونستركتور constractor في بايثون
الشكل العام للكونستركتور يكون عن طريق كتابة كلاس و أسفل هذا الكلاس نكتب def ثم نكتب دالة الكونستركتور و هي __init__ ثم فتح قوسين و نكتب به self.
الشكل العام لكتابة كونستركتور
class info: def __init__ (self):
مثال 7
class info: def __init__ (self): print ("ahmed amviip") def my_info (self): print ("database hack") c = Info ()
إذا عملنا run حالياً ستكون النتيجة هي:
ahmed amviip
نُلاحظ أنه طَبَعَ لنا فقط أول ميثود, أما الميثود الثانية لا تطبع إلا عند إستدعاءها شخصياً كالتالي
c.my_info()
بعدها إستدعاءها سوف يتم طباعتها.
مثال 8
class Info: def __init__ (self, name = "amviip", age = 21): self.name = name self.age = age def my_info (self,data = "my data"): print (" hello world man ") print (data) c = Info ("data", "26") c.my_info ("my new data") print (c.name) print (c.age) #عند عمل تشغيل للكود ستكون النتيجة hello world man my new data data 26
المثال مفهوم للجميع لا يحتاج شرح و النتيجة واضحة كتبناها.
مثال 9
أنشئ class يحتوي على constractor و تابع آخر.
class Cs: def __init__(mysillyobject, name, age): mysillyobject.name = name mysillyobject.age = age def myfunc(abc): print("Hello my name is " + abc.name) pt = Cs("Saja", 25) pt.myfunc()