جدول المحتويات[يخفي][يعرض]
في هذه المحاضرة ، سوف نتعرف على الفصول والمنشآت والميراث في الثعبان.
هذه المفاهيم مهمة حقًا في برنامج كبير حيث يلزم تحديد أنواع مختلفة.
فصول دراسية
تعتبر الفصول الدراسية ضرورية في البرمجة وليست خاصة ببايثون. الكثير من الاخرين لغات البرمجة دعم فكرة الطبقات. نستخدم الفئات لتحديد أنواع البيانات الجديدة.
لقد تعلمنا حتى الآن عن أنواع البيانات الأساسية في بايثون مثل الأرقام والسلاسل والمنطقات المنطقية. هذه هي أنواع البيانات الأساسية أو البسيطة في بايثون. لقد رأينا أيضًا نوعين من أنواع البيانات المعقدة مثل القوائم والقواميس.
في حين أن هذه الأنواع مفيدة للغاية ، إلا أنه لا يمكن استخدامها دائمًا لنمذجة المفاهيم المعقدة. على سبيل المثال ، فكر في فكرة نقطة أو عربة تسوق. عربة التسوق ليست قيمة منطقية أو قائمة. إنه نوع مختلف من البيانات. لذلك يمكننا استخدام الفئات لتحديد أنواع جديدة لنمذجة المفاهيم الحقيقية.
الآن ، دعنا نحدد نوع بيانات جديد يسمى النقطة. سيكون لهذا النوع الجديد طرق كما فحصناها من قبل.
هكذا ستفعل ذلك:
نبدأ بتحديد فصل دراسي باستخدام الكلمة الأساسية "class" وبعد ذلك مباشرة نعطي صفنا اسمًا.
class Point
الآن ، انظر إلى اصطلاح التسمية الذي استخدمته هنا. لقد قمت بكتابة الحرف الأول بالأحرف الكبيرة هنا ، وهذا ما نسميه اصطلاح تسمية باسكال. تختلف هذه الاصطلاحات عن تلك التي نستخدمها لتسمية المتغيرات والوظائف التي نستخدمها دائمًا أحرفًا صغيرة ونفصل كلمات متعددة باستخدام شرطة سفلية. ولكن عند تسمية الفئات ، لا نستخدم شرطة سفلية لفصل كلمات متعددة بدلاً من ذلك ، فنحن نكتب الحرف الأول من كل كلمة بحرف كبير.
بعد تحديد صنفنا ، يتم استخدام نقطتين مما يعني أنه تم تحديد الكتلة الآن.
class Point:
def move (self):
في هذه الكتلة ، يمكننا تحديد جميع الوظائف أو الطرق التي تنتمي إلى النقاط. على سبيل المثال ، يمكننا تحديد وظيفة تسمى "تحريك" لتحريك نقطة. لاحظ أنه بمجرد كتابة الأقواس المفتوحة ، تضيف PyCharm تلقائيًا "self" هنا. هذه كلمة رئيسية خاصة ودعوني أعود إليها قريبًا. دعونا نطبع "نقل" على المحطة.
print("move")
دعنا نحدد طريقة أخرى مثل "رسم" ونطبعها على الجهاز.
def draw(self):
print("draw")
انتهينا من تعريف فئة "النقطة". مع هذا النوع الجديد ، يمكننا إنشاء كائنات جديدة. تحدد الفئة ببساطة المخطط أو القالب لإنشاء كائنات تمثل المثيلات الفعلية بناءً على هذا المخطط. لإنشاء كائن ، نكتب اسم صفنا ثم نسميه تمامًا مثل الوظيفة. يؤدي هذا إلى إنشاء كائن جديد ثم إعادته. ثم يمكننا تخزين هذا الكائن في متغير. دعني اريك:
لقد حددنا هنا "النقطة 1" وهي نقطة ثلاثية الأبعاد. يمكنك أن ترى ذلك ، يمكننا طباعة الإحداثيات الفردية على الجهاز.
يمكننا استخدام الطريقتين "رسم" و "تحريك" مع هذه النقطة.
للتلخيص ، نستخدم الفئات لتحديد أنواع جديدة ويمكن أن تحتوي هذه الأنواع على طرق نحددها في جسم الفصل. يمكن أن تحتوي الفصول الدراسية على سمات يمكننا تعيينها في أي مكان في برامجنا.
الصانعين
حتى الآن ، تعلمنا كيفية إنشاء أنواع جديدة باستخدام الفئات. الآن هناك مشكلة صغيرة في هذا التنفيذ. يمكننا إنشاء كائن نقطي بدون إحداثي x أو y باستخدام الفئات وهذا ليس مثاليًا. دعني اريك.
لننشئ نقطة ونطبعها قبل أن نضبط إحداثي x. ينتج عن تشغيل برنامجنا خطأ في السمة مثل هذا:
هذا يعني أن الكائن النقطي ليس له سمة تسمى x. المشكلة الآن هي أنه من الممكن أن يكون لديك كائن نقطي بدون إحداثيات x أو y. هذا غير منطقي لأنه كلما تحدثنا عن نقطة ما ، نحتاج إلى معرفة مكان تلك النقطة. لحل هذه المشكلة ، نستخدم المُنشئ. المُنشئ هو دالة يتم استدعاؤها في وقت إنشاء كائن.
هنا كيف نستخدم المنشئ. أولاً ، دعنا نمرر قيم إحداثيات x و y في البرنامج أعلاه.
point = Point(10, 20)
print(point.x)
الآن ، نحتاج إلى إضافة عملية خاصة في هذه الفئة تسمى المُنشئ. تركيبها كالتالي:
def __init__(self, x, y):
init
هو اختصار للتهيئة ، وهذه هي الوظيفة أو الطريقة التي يتم استدعاؤها عند إنشاء كائن نقطة جديد. يتم إضافة x و y بعد ذلك مباشرة self
لإضافة معلمتين إضافيتين.
بعد ذلك ، يجب علينا تعيين x و y للقيم التي تم تمريرها ، أي 10 و 20
self.x = x
self.y = y
نستخدم self
للإشارة إلى الكائن الحالي ثم نقوم بتعيين السمة x على الوسيطة x التي تم تمريرها إلى الوظيفة "x". بهذه الطريقة ، باستخدام init
الطريقة ، يمكننا تهيئة كائناتنا. يشار إلى هذه الطريقة على أنها منشئ. لندير برنامجنا.
الآن ، يمكننا تغيير إحداثيات x و y لاحقًا. لنقم بتحديث تنسيق x:
point = Point(10, 20)
point.x = 11
print(point.x)
الآن ، تم تحديث إحداثي x إلى القيمة 11.
ممارسة
إليك تمرين مثير للاهتمام بالنسبة لك.
أريدك أن تحدد نوعًا جديدًا يسمى الشخص. يجب أن تحتوي كائنات "الشخص" هذه على "name
"بالإضافة إلى"talk()
" طريقة.
إنها مهمة بسيطة ولا ينبغي أن تستغرق أكثر من دقيقتين.
الحلول
ابدأ بتعريف فئة "الشخص" على النحو التالي:
class Person:
self.name = name
سنحدد المنشئ لاحقًا. الآن ، يمكننا إنشاء كائن "الشخص". دعنا نسميها جون
john = Person("John Smith")
print(john.name)
john.talk()
الآن ، انتقل إلى الجزء الأول من الكود وقم بإنشاء مُنشئ.
def __init__(self, name):
سيبدو الرمز النهائي كما يلي:
يمكنك أيضًا استخدام سلاسل منسقة ومفاهيم أخرى جنبًا إلى جنب مع الفئات والمنشئات.
وراثة
الوراثة مفهوم آخر مرتبط بالفئات التي تتيح لك إعادة استخدام رمز.
ضع في اعتبارك هذا الجزء من التعليمات البرمجية.
class Dog:
def walk(self):
print("walk")
لقد أنشأنا فئة "Dog" باستخدام طريقة "المشي". في هذه الطريقة ، نقوم ببساطة بطباعة رسالة السير على الجهاز. دعنا نقول ، في برنامج حقيقي ، هناك 10 أسطر من التعليمات البرمجية بدلاً من سطر واحد فقط هنا. في المستقبل ، إذا كانت هناك حاجة إلى فصل آخر للحصول على طريقة "المشي" ، فسيتعين علينا تكرار كل هذا الرمز. هذا ليس مثاليا.
في البرمجة ، لدينا مبدأ يسمى DRY وهو اختصار لا تكرر نفسك. دعنا نقول في وقت ما في المستقبل ، اكتشفنا مشكلة في طريقة "السير" الخاصة بنا وإذا كررنا هذه الطريقة أو كررناها في العديد من الأماكن الأخرى ، فسيتعين علينا العودة وإصلاح هذه المشكلة في كل مكان قمنا بتكرار هذا الشفرة. لهذا السبب في البرمجة لا يجب أن نحدد شيئًا مرتين.
هناك طرق مختلفة لمعالجة هذه المشكلة ولكن هنا سنتعلم الطريقة الأسهل للمبتدئين والتي تسمى الميراث. في هذه الحالة ، سننشئ فئة أخرى "mammal" ونحدد سمة "walk" الخاصة بنا في تلك الفئة.
class Mammal:
def walk(self):
print("walk")
بعد تحديد فئة "الثدييات" ، يمكننا استخدام الوراثة لتمرير السمات مثل هذا:
ترث كل من فئتي الكلب والقط جميع طرق الصنف المحددة في فئة الوالدين. الآن ، يمكننا إضافة طرق خاصة بالكلاب مثل هذا:
class Dog:
def bark(self):
print("bark")
يتم إحتوائه!
كان هذا كله يتعلق بالفئات والمُنشئين وإعادة استخدام الكود في الفئات ذات مفاهيم الوراثة. نقترب الآن من نهاية سلسلتنا. عند هذه النقطة ، يجب أن تكون قادرًا على إنتاج أكواد جيدة وسهلة القراءة وموجزة في بايثون.
سنرى مفهوم الوحدات والحزم في المحاضرة القادمة.
اترك تعليق