تعلم لغة Python الفصل 9 : ال CLASSES الجزء 2 والأخير

sparrow
0

 




الفصل : 9

الجزء : 2

الفصل : ال CLASSES






الوراثة (Inheritance)


لا تحتاج دائمًا إلى البدء من الصفر عند كتابة فئة. إذا كانت الفئة التي تكتبها هي نسخة متخصصة من فئة أخرى كتبتها، يمكنك استخدام الوراثة. عندما ترث فئة من أخرى، فإنها تأخذ صفات (attributes) وطرق (methods) الفئة الأولى. الفئة الأصلية تسمى الفئة الأب، والفئة الجديدة تسمى الفئة الابن. يمكن للفئة الابن أن ترث أي أو كل الصفات والطرق من الفئة الأب، ولكنها أيضًا حرة في تعريف صفات وطرق جديدة خاصة بها.


طريقة __init__() لفئة الابن


عندما تكتب فئة جديدة تعتمد على فئة موجودة، ستحتاج غالبًا إلى استدعاء طريقة __init__() من الفئة الأب. هذا سيقوم بتهيئة أي صفات تم تعريفها في طريقة __init__() للفئة الأب وجعلها متاحة في الفئة الابن.


كمثال، دعونا نمذج سيارة كهربائية. السيارة الكهربائية هي مجرد نوع محدد من السيارات، لذا يمكننا أن نستند إلى فئة ElectricCar الجديدة على فئة Car التي كتبناها سابقًا. بعد ذلك، سنحتاج فقط إلى كتابة كود للصفات والسلوكيات الخاصة بالسيارات الكهربائية.


لنبدأ بإنشاء نسخة بسيطة من فئة ElectricCar، التي تقوم بكل شيء تقوم به فئة Car:



نبدأ بـ Car. عندما تقوم بإنشاء فئة ابن، يجب أن تكون الفئة الأب جزءًا من الملف الحالي ويجب أن تظهر قبل الفئة الابن في الملف. ثم نقوم بتعريف الفئة الابن، ElectricCar. يجب تضمين اسم الفئة الأب بين القوسين في تعريف الفئة الابن. تأخذ طريقة __init__() المعلومات المطلوبة لإنشاء instance من Car.


تعتبر وظيفة super() هي function خاصة تتيح لك استدعاء method من الفئة الأب. يخبر هذا السطر بايثون باستدعاء طريقة __init__() من Car، التي تمنح instance من ElectricCar جميع الصفات المحددة في تلك الطريقة. يأتي اسم super من تقليد تسمية الفئة الأب superclass والفئة الابن subclass.


نختبر ما إذا كانت الوراثة تعمل بشكل صحيح من خلال محاولة إنشاء سيارة كهربائية بالمعلومات نفسها التي نقدمها عند إنشاء سيارة عادية. نقوم بإنشاء instance من فئة ElectricCar ونعينها إلى my_leaf. يستدعي هذا السطر طريقة __init__() المعرفة في ElectricCar، التي تخبر بايثون بدورها باستدعاء طريقة __init__() المعرفة في الفئة الأب Car. نقدم الوسيطات 'nissan' و'leaf' و2024. باستثناء __init__()، لا توجد صفات أو طرق بعد تخص السيارات الكهربائية. في هذه المرحلة، نحن نتأكد فقط من أن السيارة الكهربائية لديها السلوكيات المناسبة للسيارة:



يعمل instance من ElectricCar تمامًا مثل instance من Car، لذا يمكننا الآن البدء في تعريف الصفات والطرق الخاصة بالسيارات الكهربائية.


تعريف الAttributes والMethods لفئة الابن


بمجرد أن يكون لديك فئة ابن ترث من فئة أب، يمكنك إضافة أي صفات وطرق جديدة ضرورية لتمييز فئة الابن عن الفئة الأب.


دعونا نضيف صفة خاصة بالسيارات الكهربائية (بطارية، على سبيل المثال) وطريقة للإبلاغ عن هذه الصفة. سنقوم بتخزين حجم البطارية وكتابة طريقة تطبع وصفًا للبطارية:



نضيف صفة جديدة `self.battery_size` ونعين قيمتها الأولية إلى 40. هذه الصفة ستكون مرتبطة بجميع instances التي تم إنشاؤها من فئة ElectricCar ولكن لن تكون مرتبطة بأي instances من فئة Car. نضيف أيضًا طريقة تسمى `describe_battery()` التي تطبع معلومات عن البطارية. عند استدعاء هذه الطريقة، نحصل على وصف يخص السيارة الكهربائية بوضوح:



لا يوجد حد لمدى تخصص فئة ElectricCar. يمكنك إضافة العديد من الصفات والطرق كما تحتاج لنمذجة السيارة الكهربائية بدقة التي تريدها. يجب إضافة أي صفة أو طريقة يمكن أن تنتمي إلى أي سيارة، بدلاً من تلك الخاصة بالسيارات الكهربائية فقط، إلى فئة Car بدلاً من فئة ElectricCar. بعد ذلك، أي شخص يستخدم فئة Car سيكون لديه تلك الوظائف متاحة أيضًا، وستحتوي فئة ElectricCar فقط على الكود الخاص بالمعلومات والسلوكيات المتعلقة بالمركبات الكهربائية.


تجاوز Methods الفئة الأب


يمكنك تجاوز أي طريقة (Methods) من الفئة الأب التي لا تناسب ما تحاول نمذجته باستخدام الفئة الابن. للقيام بذلك، تقوم بتعريف طريقة في الفئة الابن بنفس اسم الطريقة التي تريد تجاوزها في الفئة الأب. سيقوم بايثون بتجاهل طريقة الفئة الأب ويهتم فقط بالطريقة التي تعرفها في الفئة الابن.


لنقل أن فئة Car لديها طريقة تسمى `fill_gas_tank()`. هذه الطريقة لا معنى لها لمركبة كهربائية بالكامل، لذلك قد ترغب في تجاوز هذه الطريقة. إليك طريقة للقيام بذلك:



الآن إذا حاول شخص ما استدعاء `fill_gas_tank()` مع سيارة كهربائية، فإن بايثون سيتجاهل الطريقة `fill_gas_tank()` في Car ويشغل هذا الكود بدلاً من ذلك. عند استخدام الوراثة، يمكنك جعل فئات الابن تحتفظ بما تحتاجه وتجاوز أي شيء لا تحتاجه من الفئة الأب.


ال Instances كصفات


عند نمذجة شيء من العالم الحقيقي في الكود، قد تجد أنك تضيف المزيد والمزيد من التفاصيل إلى فئة. ستجد أن لديك قائمة متزايدة من الصفات والطرق وأن ملفاتك تصبح طويلة. في هذه الحالات، قد تدرك أن جزءًا من فئة يمكن كتابته كفئة منفصلة. يمكنك تقسيم فئتك الكبيرة إلى فئات أصغر تعمل معًا؛ يُطلق على هذا النهج التكوين (composition).


على سبيل المثال، إذا واصلنا إضافة التفاصيل إلى فئة ElectricCar، فقد نلاحظ أننا نضيف العديد من الصفات والطرق الخاصة ببطارية السيارة. عندما نرى هذا يحدث، يمكننا التوقف ونقل تلك الصفات والطرق إلى فئة منفصلة تسمى Battery. بعد ذلك، يمكننا استخدام instance من Battery كصفة في فئة ElectricCar:



نحن نقوم بتعريف فئة جديدة تسمى `Battery` والتي لا ترث من أي فئة أخرى. دالة `__init__()` ❶ تحتوي على معامل واحد، `battery_size`، بالإضافة إلى `self`. هذا المعامل اختياري ويضبط حجم البطارية إلى 40 إذا لم يتم توفير قيمة. تم نقل الدالة `describe_battery()` إلى هذه الفئة أيضًا ❷.


في فئة `ElectricCar`، نضيف الآن صفة تسمى `self.battery` ❸. يخبر هذا السطر بايثون بإنشاء مثيل جديد من `Battery` (بحجم افتراضي 40، لأننا لم نحدد قيمة) وتعيين هذا المثيل إلى الصفة `self.battery`. سيحدث هذا كلما تم استدعاء دالة `__init__()`؛ أي مثيل من `ElectricCar` سيحتوي الآن على مثيل `Battery` يتم إنشاؤه تلقائيًا.


نقوم بإنشاء سيارة كهربائية ونعينها إلى المتغير `my_leaf`. عندما نريد وصف البطارية، نحتاج إلى العمل من خلال صفة البطارية للسيارة:


يخبر هذا السطر بايثون بالنظر إلى المثيل `my_leaf`، والعثور على صفة البطارية الخاصة به، واستدعاء الدالة `describe_battery()` المرتبطة بمثيل `Battery` المعين إلى الصفة.


الإخراج هو نفسه الذي رأيناه سابقًا:


يبدو أن هذا الكثير من العمل الإضافي، ولكن الآن يمكننا وصف البطارية بالتفصيل الذي نريده دون تشويش فئة `ElectricCar`. دعنا نضيف دالة أخرى إلى `Battery` تقوم بالإبلاغ عن مدى السيارة بناءً على حجم البطارية:



الدالة الجديدة `get_range()` تقوم بتحليل بسيط. إذا كانت سعة البطارية 40 kWh، فإن `get_range()` تضبط المدى إلى 150 ميلًا، وإذا كانت السعة 65 kWh، فإنها تضبط المدى إلى 225 ميلًا. ثم تقوم بالإبلاغ عن هذه القيمة. عندما نريد استخدام هذه الدالة، يجب علينا مرة أخرى استدعائها من خلال صفة البطارية للسيارة ❶.


الإخراج يخبرنا بمدى السيارة بناءً على حجم بطاريتها:


نمذجة الكائنات الواقعية (Modeling Real-World Objects)


عندما تبدأ في نمذجة أشياء أكثر تعقيدًا مثل السيارات الكهربائية، ستواجه أسئلة مثيرة للاهتمام. هل مدى السيارة الكهربائية صفة من صفات البطارية أم من صفات السيارة؟ إذا كنا نصف سيارة واحدة فقط، فمن المحتمل أن تكون المحافظة على ارتباط دالة `get_range()` بفئة `Battery` أمرًا جيدًا. ولكن إذا كنا نصف خط إنتاج كامل لشركة سيارات، فقد نريد نقل `get_range()` إلى فئة `ElectricCar`. ستظل دالة `get_range()` تتحقق من حجم البطارية قبل تحديد المدى، ولكنها ستبلغ عن مدى محدد لنوع السيارة التي ترتبط بها. بدلاً من ذلك، يمكننا الحفاظ على ارتباط دالة `get_range()` بالبطارية ولكن نمرر لها معاملًا مثل `car_model`. ستقوم دالة `get_range()` بعد ذلك بالإبلاغ عن المدى بناءً على حجم البطارية ونموذج السيارة.


هذا يقودك إلى نقطة مثيرة في نموك كمبرمج. عندما تتصارع مع أسئلة مثل هذه، فإنك تفكر على مستوى منطقي أعلى بدلاً من مستوى يركز على بناء الجمل. أنت لا تفكر في بايثون، بل تفكر في كيفية تمثيل العالم الواقعي بالكود. عندما تصل إلى هذه النقطة، ستدرك أنه غالبًا لا توجد طرق صحيحة أو خاطئة لنمذجة الحالات الواقعية. بعض النهج تكون أكثر كفاءة من غيرها، ولكن الأمر يتطلب الممارسة للعثور على أكثر التمثيلات كفاءة. إذا كان الكود الخاص بك يعمل كما تريد، فأنت تفعل بشكل جيد! لا تشعر بالإحباط إذا وجدت نفسك تقوم بإعادة تنظيم وإعادة كتابة فئاتك عدة مرات باستخدام نهج مختلفة. في السعي لكتابة كود دقيق وفعال، يمر الجميع بهذه العملية.


جرب بنفسك


تمرين 9-6. Ice Cream Stand: المثلجات عبارة عن نوع محدد من المطاعم. اكتب فئة تسمى `IceCreamStand` التي ترث من الفئة `Restaurant` التي كتبتها في التمرين 9-1 أو التمرين 9-4 . أي نسخة من الفئة ستعمل؛ فقط اختر التي تفضلها. أضف صفة تسمى `flavors` التي تخزن قائمة بنكهات المثلجات. اكتب دالة تعرض هذه النكهات. أنشئ مثيلًا من `IceCreamStand`، واستدع هذه الدالة.


تمرين 9-7. Admin: المدير هو نوع خاص من المستخدمين. اكتب فئة تسمى `Admin` التي ترث من الفئة `User` التي كتبتها في التمرين 9-3 أو التمرين 9-5 . أضف صفة، `privileges`، التي تخزن قائمة من السلاسل مثل "can add post"، "can delete post"، "can ban user"، وهكذا. اكتب دالة تسمى `show_privileges()` التي تسرد مجموعة امتيازات المدير. أنشئ مثيلًا من `Admin`، واستدع دالتك.


تمرين 9-8. Privileges: اكتب فئة `Privileges` منفصلة. يجب أن تحتوي الفئة على صفة واحدة، `privileges`، التي تخزن قائمة من السلاسل كما هو موصوف في التمرين 9-7. انقل دالة `show_privileges()` إلى هذه الفئة. أنشئ مثيلًا من `Privileges` كصفة في فئة `Admin`. أنشئ مثيلًا جديدًا من `Admin` واستخدم دالتك لعرض امتيازاته.


تمرين 9-9. Battery Upgrade: استخدم النسخة النهائية من `electric_car.py` من هذا القسم. أضف دالة إلى فئة `Battery` تسمى `upgrade_battery()`. يجب أن تتحقق هذه الدالة من حجم البطارية وتضبط السعة إلى 65 إذا لم تكن بالفعل. أنشئ سيارة كهربائية بحجم بطارية افتراضي، استدع `get_range()` مرة، ثم استدع `get_range()` مرة ثانية بعد ترقية البطارية. يجب أن ترى زيادة في مدى السيارة.

 


استيراد الفئات (Importing Classes)


بينما تضيف المزيد من الوظائف إلى فئاتك، يمكن أن تصبح ملفاتك طويلة، حتى عند استخدام الوراثة والتكوين بشكل صحيح. تماشيًا مع الفلسفة العامة لـ Python، سترغب في إبقاء ملفاتك غير مكدسة قدر الإمكان. للمساعدة، تتيح لك Python تخزين الفئات في وحدات ثم استيراد الفئات التي تحتاجها إلى برنامجك الرئيسي.


استيراد فئة واحدة


لنقم بإنشاء وحدة تحتوي فقط على فئة Car. هذا يثير مشكلة تسمية دقيقة: لدينا بالفعل ملف باسم car.py في هذا الفصل، ولكن يجب تسمية هذه الوحدة بـ car.py لأنها تحتوي على كود يمثل سيارة. سنحل هذه المشكلة التسمية عن طريق تخزين فئة Car في وحدة تسمى car.py، مستبدلين ملف car.py الذي كنا نستخدمه سابقًا. من الآن فصاعدًا، أي برنامج يستخدم هذه الوحدة سيحتاج إلى اسم ملف أكثر تحديدًا، مثل my_car.py. هنا car.py مع الكود من الفئة Car فقط:




نحن ندرج وحدة مستوى docstring التي تصف محتويات هذه الوحدة باختصار ❶. يجب عليك كتابة docstring لكل وحدة تنشئها. الآن نقوم بإنشاء ملف منفصل يسمى my_car.py. هذا الملف سيستورد فئة Car ثم ينشئ مثيلًا من تلك الفئة:



تعليمات الاستيراد ❶ تخبر Python بفتح وحدة car واستيراد فئة Car. الآن يمكننا استخدام فئة Car كما لو كانت معرفة في هذا الملف. المخرج هو نفسه الذي رأيناه سابقًا:



استيراد الفئات هو وسيلة فعالة للبرمجة. تخيل مدى طول هذا الملف البرمجي إذا كانت الفئة Car بأكملها مدرجة. عندما تقوم بدلاً من ذلك بنقل الفئة إلى وحدة واستيراد الوحدة، فإنك تحصل على نفس الوظائف، ولكنك تحتفظ بملف البرنامج الرئيسي نظيفًا وسهل القراءة. كما أنك تخزن معظم المنطق في ملفات منفصلة؛ بمجرد أن تعمل فئاتك كما تريد، يمكنك ترك تلك الملفات وشأنها والتركيز على المنطق عالي المستوى لبرنامجك الرئيسي.


تخزين عدة فئات (Classes) في وحدة (Module)


يمكنك تخزين العديد من الفئات كما تحتاج في وحدة واحدة، على الرغم من أن كل فئة في وحدة يجب أن تكون مرتبطة بطريقة ما. الفئات Battery وElectricCar كلتاهما تساعد في تمثيل السيارات، لذا دعونا نضيفهما إلى وحدة car.py.



هذا يحتوي على نفس المخرج الذي رأيناه سابقًا، على الرغم من أن معظم المنطق مخفي في وحدة:



استيراد عدة فئات من وحدة


يمكنك استيراد العديد من الفئات كما تحتاج في ملف البرنامج. إذا كنا نريد صنع سيارة عادية وسيارة كهربائية في نفس الملف، نحتاج إلى استيراد الفئتين، Car وElectricCar:


تستورد الفئات المتعددة من وحدة بفصل كل فئة بفاصلة ❶. بمجرد استيراد الفئات الضرورية، أنت حر في إنشاء العديد من المثيلات لكل فئة كما تحتاج.


في هذا المثال نصنع سيارة Ford Mustang عادية ❷ ثم سيارة Nissan Leaf كهربائية ❸:




استيراد وحدة كاملة


يمكنك أيضًا استيراد وحدة كاملة ثم الوصول إلى الفئات التي تحتاجها باستخدام النقاط. هذه الطريقة بسيطة وتؤدي إلى كود سهل القراءة. نظرًا لأن كل استدعاء ينشئ مثيلًا لفئة يشمل اسم الوحدة، فلن تواجه تعارضات تسمية مع أي أسماء مستخدمة في الملف الحالي.


إليك ما يبدو عليه استيراد وحدة car بأكملها ثم إنشاء سيارة عادية وسيارة كهربائية:



أولاً، نستورد وحدة car بأكملها ❶. ثم نصل إلى الفئات التي نحتاجها من خلال صيغة module_name.ClassName. نصنع مرة أخرى سيارة Ford Mustang ❷، وسيارة Nissan Leaf ❸.


استيراد جميع الفئات من وحدة


يمكنك استيراد كل الفئات من وحدة باستخدام الصيغة التالية:


هذه الطريقة ليست موصى بها لسببين. أولاً، من المفيد أن تكون قادرًا على قراءة تعليمات الاستيراد في أعلى الملف والحصول على فكرة واضحة عن الفئات التي يستخدمها البرنامج. باستخدام هذه الطريقة، من غير الواضح أي الفئات تستخدمها من الوحدة. يمكن أن تؤدي هذه الطريقة أيضًا إلى الارتباك مع الأسماء في الملف. إذا قمت باستيراد فئة بالخطأ بنفس اسم شيء آخر في ملف البرنامج، يمكنك إنشاء أخطاء يصعب تشخيصها. أعرض هذا هنا لأنك حتى لو لم تكن هذه الطريقة موصى بها، من المحتمل أن تراها في كود أشخاص آخرين في مرحلة ما.


إذا كنت تحتاج إلى استيراد العديد من الفئات من وحدة، من الأفضل استيراد الوحدة بأكملها واستخدام صيغة module_name.ClassName. لن ترى كل الفئات المستخدمة في أعلى الملف، ولكن سترى بوضوح مكان استخدام الوحدة في البرنامج. ستتجنب أيضًا تعارضات التسمية المحتملة التي يمكن أن تنشأ عندما تستورد كل فئة في وحدة.


استيراد وحدة في وحدة أخرى


في بعض الأحيان سترغب في توزيع فئاتك على عدة modules للحفاظ على عدم تضخم أي ملف واحد وتجنب تخزين الفئات غير ذات الصلة في نفس module. عندما تخزن فئاتك في عدة modules، قد تجد أن فئة في module تعتمد على فئة في module أخرى. عندما يحدث هذا، يمكنك استيراد الفئة المطلوبة في الوحدة الأولى.


على سبيل المثال، لنقم بتخزين فئة Car في module واحدة وفئات ElectricCar وBattery في module منفصلة. سننشئ module جديدة تسمى electric_car.py—مستبدلين ملف electric_car.py الذي أنشأناه سابقًا—وننسخ فقط فئات Battery وElectricCar في هذا الملف:


فئة ElectricCar تحتاج إلى الوصول إلى فئتها الأم Car، لذا نستورد Car مباشرة في الmodule . إذا نسينا هذا السطر، سترفع Python خطأ عندما نحاول استيراد وحدة electric_car. نحتاج أيضًا إلى تحديث وحدة Car بحيث تحتوي فقط على فئة Car:



الآن يمكننا استيراد من كل وحدة بشكل منفصل وإنشاء أي نوع من السيارات التي نحتاجها:



نستورد Car من وحدتها، وElectricCar من وحدتها. ثم نصنع سيارة عادية وسيارة كهربائية. كلا السيارتين يتم إنشاؤهما بشكل صحيح:


استخدام الأسماء المستعارة


كما رأيت في الفصل 8، يمكن أن تكون الأسماء المستعارة مفيدة جدًا عند استخدام الوحدات لتنظيم كود مشاريعك. يمكنك استخدام الأسماء المستعارة عند استيراد الفئات أيضًا.


كمثال، فكر في برنامج حيث تريد صنع مجموعة من السيارات الكهربائية. قد يصبح متعبًا كتابة (وقراءة) ElectricCar مرارًا وتكرارًا. يمكنك إعطاء ElectricCar اسمًا مستعارًا في تعليمات الاستيراد:


الآن يمكنك استخدام هذا الاسم المستعار كلما أردت صنع سيارة كهربائية:


يمكنك أيضًا إعطاء وحدة اسمًا مستعارًا. إليك كيفية استيراد وحدة electric_car بأكملها باستخدام اسم مستعار:


الآن يمكنك استخدام هذا الاسم المستعار للوحدة مع الاسم الكامل للفئة:

`


إيجاد سير العمل الخاص بك


كما ترى، توفر لك Python العديد من الخيارات لكيفية هيكلة الكود في مشروع كبير. من المهم معرفة كل هذه الاحتمالات حتى تتمكن من تحديد أفضل الطرق لتنظيم مشاريعك وكذلك لفهم مشاريع الآخرين.


عندما تبدأ، اجعل بنية الكود بسيطة. حاول القيام بكل شيء في ملف واحد ثم نقل الفئات إلى وحدات منفصلة بمجرد أن يعمل كل شيء. إذا كنت تحب كيفية تفاعل الوحدات والملفات، حاول تخزين فئاتك في وحدات عند بدء مشروع. اعثر على نهج يتيح لك كتابة كود يعمل، وانطلق من هناك.



جربها بنفسك


تمرين 9-10. مطعم مستورد:

باستخدام أحدث فئة من فئة المطعم (Restaurant class)، قم بتخزينها في وحدة (module). قم بإنشاء ملف منفصل يستورد فئة المطعم (Restaurant). قم بإنشاء مثيل (instance) من فئة المطعم، واستدعِ أحد طرق (methods) فئة المطعم لإظهار أن تعليمة الاستيراد تعمل بشكل صحيح.


تمرين 9-11. مدير مستورد:

ابدأ بعملك من التمرين 9-8. قم بتخزين الفئات User، Privileges، وAdmin في وحدة واحدة. قم بإنشاء ملف منفصل، أنشئ مثيلًا لفئة Admin، واستدعِ دالة show_privileges() لإظهار أن كل شيء يعمل بشكل صحيح.


تمرين 9-12. وحدات متعددة:

قم بتخزين فئة User في وحدة واحدة، وقم بتخزين فئتي Privileges وAdmin في وحدة منفصلة. في ملف منفصل، أنشئ مثيلًا لفئة Admin واستدعِ دالة show_privileges() لإظهار أن كل شيء لا يزال يعمل بشكل صحيح.

 


مكتبة بايثون القياسية


مكتبة بايثون القياسية هي مجموعة من الوحدات المضمنة مع كل تثبيت لـ Python. الآن بعد أن أصبحت لديك فهمًا أساسيًا لكيفية عمل الوظائف والفئات، يمكنك البدء في استخدام الوحدات مثل هذه التي كتبها مبرمجون آخرون. يمكنك استخدام أي وظيفة أو فئة في المكتبة القياسية عن طريق تضمين تعليمة استيراد بسيطة في أعلى ملفك. لنلقِ نظرة على إحدى الوحدات، random، التي يمكن أن تكون مفيدة في نمذجة العديد من الحالات الواقعية.


وظيفة مثيرة للاهتمام من وحدة random هي randint(). هذه الوظيفة تأخذ وسيطين من الأعداد الصحيحة وتعيد عددًا صحيحًا مختارًا عشوائيًا بين (بما في ذلك) هذين الرقمين.


إليك كيفية توليد رقم عشوائي بين 1 و 6:



وظيفة أخرى مفيدة هي choice(). هذه الوظيفة تأخذ قائمة أو tuple وتعيد عنصرًا مختارًا عشوائيًا:


وحدة random لا ينبغي استخدامها عند بناء تطبيقات متعلقة بالأمان، لكنها تعمل بشكل جيد للعديد من المشاريع الممتعة والمثيرة للاهتمام.


ملاحظة:

يمكنك أيضًا تحميل الوحدات من مصادر خارجية. سترى عددًا من هذه الأمثلة في الجزء الثاني من المنهج الخاص بالمشاريع، حيث سنحتاج إلى وحدات خارجية لإكمال كل مشروع.

 


جربها بنفسك

تمرين 9-13. Dice:

قم بإنشاء فئة Die بخصيصة واحدة تسمى sides، التي لها قيمة افتراضية قدرها 6. اكتب دالة تسمى roll_die() التي تطبع رقمًا عشوائيًا بين 1 وعدد الجوانب التي تمتلكها النرد. اصنع نردًا بـ 6 جوانب ولفه 10 مرات. اصنع نردًا بـ 10 جوانب ونردًا بـ 20 جانبًا. لف كل نرد 10 مرات.


تمرين 9-14. Lottery:

قم بإنشاء قائمة أو tuple تحتوي على سلسلة من 10 أرقام و5 حروف. اختر عشوائيًا 4 أرقام أو حروف من القائمة واطبع رسالة تقول إن أي تذكرة تطابق هذه الأرقام أو الحروف الأربعة تفوز بجائزة.


تمرين 9-15. تحليل اليانصيب:

يمكنك استخدام حلقة لترى مدى صعوبة الفوز بالنوع الذي نمذجه اليانصيب الذي قمت به للتو. قم بإنشاء قائمة أو tuple تسمى my_ticket. اكتب حلقة تستمر في سحب الأرقام حتى تفوز تذكرتك. اطبع رسالة توضح عدد المرات التي كان يجب أن تعمل فيها الحلقة لمنحك تذكرة رابحة.


تمرين 9-16. وحدة بايثون للأسبوع:

أحد الموارد الممتازة لاستكشاف مكتبة بايثون القياسية هو موقع يسمى Python Module of the Week. اذهب إلى [Python Module of the Week](https://pymotw.com) وانظر إلى جدول المحتويات. ابحث عن وحدة تبدو مثيرة للاهتمام بالنسبة لك واقرأ عنها، ربما تبدأ بوحدة random.

 


تنسيق الفئات


بعض قضايا التنسيق المتعلقة بالفئات تستحق التوضيح، خاصة مع تعقيد برامجك.


يجب كتابة أسماء الفئات بنمط CamelCase. للقيام بذلك، قم بتكبير الحرف الأول من كل كلمة في الاسم، ولا تستخدم الشرطة السفلية. يجب كتابة أسماء المثيلات والوحدات بالحروف الصغيرة، مع الشرطة السفلية بين الكلمات.


يجب أن تحتوي كل فئة على docstring مباشرة بعد تعريف الفئة. يجب أن يكون docstring وصفًا موجزًا لما تفعله الفئة، ويجب أن تتبع نفس قواعد التنسيق التي استخدمتها لكتابة docstrings في الوظائف. يجب أن تحتوي كل وحدة أيضًا على docstring يصف ما يمكن استخدام الفئات في الوحدة من أجله.


يمكنك استخدام الأسطر الفارغة لتنظيم الكود، لكن لا تستخدمها بشكل مفرط. داخل الفئة، يمكنك استخدام سطر فارغ واحد بين الطرق، وداخل الوحدة يمكنك استخدام سطرين فارغين لفصل الفئات.


إذا كنت بحاجة إلى استيراد وحدة من المكتبة القياسية ووحدة قمت بكتابتها، ضع تعليمة الاستيراد للوحدة من المكتبة القياسية أولاً. ثم أضف سطرًا فارغًا وتعليمة الاستيراد للوحدة التي قمت بكتابتها. في البرامج ذات تعليمات الاستيراد المتعددة، يجعل هذا التنسيق من الأسهل رؤية مصدر الوحدات المستخدمة في البرنامج.


ملخص


في هذا الفصل، تعلمت كيفية كتابة الفئات الخاصة بك. تعلمت كيفية تخزين المعلومات في فئة باستخدام الخصائص وكيفية كتابة الطرق التي تمنح فئاتك السلوك الذي تحتاجه. تعلمت كتابة دوال __init__() التي تنشئ مثيلات من الفئات الخاصة بك بالخصائص التي تريدها بالضبط. شاهدت كيفية تعديل خصائص المثيل مباشرة وعبر الطرق. تعلمت أن الوراثة يمكن أن تبسط إنشاء الفئات ذات الصلة ببعضها، وتعلمت استخدام مثيلات فئة واحدة كخصائص في فئة أخرى للحفاظ على كل فئة بسيطة.


شاهدت كيفية تخزين الفئات في وحدات واستيراد الفئات التي تحتاجها في الملفات التي سيتم استخدامها فيها للحفاظ على مشاريعك منظمة. بدأت في التعرف على مكتبة بايثون القياسية، وشاهدت مثالًا يعتمد على وحدة random. أخيرًا، تعلمت تنسيق الفئات الخاصة بك باستخدام قواعد بايثون.


في الفصل 10، ستتعلم كيفية العمل مع الملفات حتى تتمكن من حفظ العمل الذي قمت به في برنامج والعمل الذي سمحت للمستخدمين بالقيام به. ستتعلم أيضًا عن الاستثناءات، فئة خاصة ببايثون مصممة لمساعدتك في الاستجابة للأخطاء عند حدوثها.




 


النهاية


نكون هنا انتهينا من الفصل 9 من منهج تعلم Python من كتاب python crash course بالعربية 


واذا واجهتك اي مشكلة في الفهم او ما شابه , يمكنك على الفور الذهاب الى المجتمع الخاص بنا في Telegram للمناقشة والتواصل معنا من هنا  


او اذا واجهتك مشكلة في الموقع او تريد اجابة سريعة يمكنك الذهاب الى اخر صفحة في الموقع ستجد صفحة اتصل بنا موجودة يمكنك ارسالة لنا مشكلتك , وسيتم الرد عليها بسرعة جدا ان شاء الله 


ويمكنك الأنضمام الى المجتمع Hidden Lock بالكامل مع جميع قنواته للأستفادة في اخر الأخبار في عالم التقنية وايضا الكتب بالمجان والكورسات والمقالات من خلال الرابط التالي لمجموعة القنوات من     هنا 


يمكنك ايضا متابعتنا في منصات X او Twitter سابقا , لمشاهدة الاخبار والمقالات السريعة والمهمة من  

هنا


وفقط كان معكم sparrow مقدم هذه الشهادة من فريق Hidden Lock 



Tags

إرسال تعليق

0تعليقات

إرسال تعليق (0)

#buttons=(موافق!) #days=(20)

يستخدم موقعنا ملفات تعريف الارتباط لتحسين تجربتك. تاكد الان
Ok, Go it!