دليل المبتدئين لبرمجة بايثون كائنية التوجه (OOP)

A VPN is an essential component of IT security, whether you’re just starting a business or are already up and running. Most business interactions and transactions happen online and VPN

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

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

هذا هو السبب الأساسي لتعلم البرمجة الشيئية في Python ، والتي تعد أيضًا واحدة من أكثر لغات البرمجة شيوعًا.

هيا نتعلم!

مثال على برنامج بايثون

قبل البحث في الأمر ، دعنا نطرح سؤالاً: هل سبق لك أن كتبت برنامج Python مثل البرنامج أدناه؟

secret_number = 20
 
while True:
   number = input('Guess the number: ')
 
   try:
       number = int(number)
   except:
       print('Sorry that is not a number')
       continue
 
   if number != secret_number:
       if number > secret_number:
           print(number, 'is greater than the secret number')
 
       elif number < secret_number:
           print(number, 'is less than the secret number')
   else:
       print('You guessed the number:', secret_number)
       break

هذا الرمز هو مجرد رقم حاسب. حاول نسخه في ملف Python وتشغيله في نظامك. إنه يحقق الغرض منه تمامًا.

ولكن هنا تأتي مشكلة كبيرة: ماذا لو طلبنا منك تنفيذ ميزة جديدة ؟ يمكن أن يكون شيئًا بسيطًا – على سبيل المثال:

“إذا كان الإدخال مضاعفًا للرقم السري ، فامنح المستخدم تلميحًا”.

سينمو البرنامج بسرعة معقدًا وثقيلًا مع زيادة عدد الميزات ، وبالتالي العدد الإجمالي للحالات الشرطية المتداخلة.

هذه هي بالضبط المشكلة التي تحاول البرمجة الشيئية حلها.

متطلبات تعلم Python OOP

قبل التوجه إلى البرمجة الشيئية ، نوصي بشدة أن يكون لديك فهم قوي لأساسيات بايثون.

قد يكون تصنيف الموضوعات التي تعتبر “أساسية” أمرًا صعبًا. لهذا السبب ، قمنا بتصميم ورقة غش تحتوي على جميع المفاهيم الأساسية اللازمة لتعلم البرمجة الموجهة للكائنات في Python.

متغير: اسم رمزي يشير إلى كائن معين (سنرى ما تعنيه الكائنات من خلال المقالة).

العوامل الحسابية: الجمع (+) ، الطرح (-) ، الضرب (*) ، القسمة (/) ، القسمة الصحيحة (//) ، النموذج (٪).

أنواع البيانات المضمنة : رقمية (أعداد صحيحة ، عوامات ، معقدة) ، متواليات (سلاسل ، قوائم ، مجموعات) ، منطقية (صواب ، خطأ) ، قواميس ، ومجموعات.

التعبيرات المنطقية: التعبيرات التي تكون النتيجة فيها صواب أو خطأ.

شرطي: يقيم تعبيرًا منطقيًا ويقوم ببعض العمليات اعتمادًا على النتيجة. يتم التعامل معها بواسطة عبارات if / else .

الحلقة: التنفيذ المتكرر لكتل ​​التعليمات البرمجية. يمكن أن يكون من أجل أو أثناء الحلقات.

الوظائف: كتلة من الكود المنظم والقابل لإعادة الاستخدام. تقوم بإنشائها باستخدام الكلمة الأساسية def .

الوسيطات: يتم تمرير الكائنات إلى دالة. على سبيل المثال:sum([1, 2, 4])

قم بتشغيل برنامج نصي بلغة Python : افتح Terminal أو سطر الأوامر واكتب “python <اسم الملف>.”

افتح Python Shell : افتح Terminal واكتب pythonأو python3حسب نظامك.

الآن لديك هذه المفاهيم واضحة تمامًا ، يمكنك المضي قدمًا في فهم البرمجة الموجهة للكائنات.

ما هي البرمجة الشيئية في بايثون؟

البرمجة الشيئية (OOP) هي نموذج برمجة يمكننا من خلاله التفكير في المشكلات المعقدة ككائنات.

النموذج هو نظرية توفر الأساس لحل المشكلات.

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

الكائن في Python هو مجموعة واحدة من البيانات (السمات) والسلوك (الطرق). يمكنك التفكير في الأشياء على أنها أشياء حقيقية من حولك. على سبيل المثال ، ضع في اعتبارك الآلات الحاسبة:

يمكن أن تكون الآلة الحاسبة كائنًا.

يمكن أن تكون الآلة الحاسبة كائنًا.

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

هذا التقسيم هو المفهوم المركزي للبرمجة الشيئية. أنت تنشئ كائنات تخزن البيانات وتحتوي على أنواع معينة من الوظائف.

لماذا نستخدم البرمجة الشيئية في بايثون؟

يتيح لك OOP إنشاء برامج آمنة وموثوقة. تستخدم العديد من أطر عمل ومكتبات Python هذا النموذج لبناء قاعدة الكود الخاصة بهم. بعض الأمثلة هي Django و Kivy و pandas و NumPy و TensorFlow.

دعونا نرى المزايا الرئيسية لاستخدام OOP في Python.

مزايا Python OOP

ستجعلك الأسباب التالية تختار استخدام البرمجة الشيئية في بايثون.

جميع لغات البرمجة الحديثة تستخدم OOP

هذا النموذج مستقل عن اللغة. إذا تعلمت OOP في Python ، فستتمكن من استخدامها في ما يلي:

جافا

PHP (تأكد من قراءة المقارنة بين PHP و Python )

روبي

جافا سكريبت

سي #

كوتلن

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

يتيح لك OOP البرمجة بشكل أسرع

لا يعني الترميز بشكل أسرع كتابة عدد أقل من سطور التعليمات البرمجية. هذا يعني أنه يمكنك تنفيذ المزيد من الميزات في وقت أقل دون المساس باستقرار المشروع.

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

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

تنخفض الإنتاجية مع وجود رمز غير مقروء

تنخفض الإنتاجية مع وجود رمز غير مقروء

سترى المزيد عن مبدأ التجريد لاحقًا.

يساعدك OOP على تجنب كود السباغيتي

هل تتذكر برنامج Number guesser في بداية هذه المقالة؟

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

يمنحنا OOP إمكانية ضغط كل المنطق في الكائنات ، وبالتالي تجنب القطع الطويلة من if’s المتداخلة .

OOP يحسن تحليلك لأي موقف

بمجرد حصولك على بعض الخبرة مع OOP ، ستتمكن من التفكير في المشكلات كأشياء صغيرة ومحددة.

هذا الفهم يؤدي إلى تهيئة سريعة للمشروع.

البرمجة المهيكلة مقابل البرمجة الشيئية

البرمجة المنظمة هي النموذج الأكثر استخدامًا من قبل المبتدئين لأنها أبسط طريقة لبناء برنامج صغير.

يتضمن تشغيل برنامج Python بالتتابع. هذا يعني أنك تعطي الكمبيوتر قائمة بالمهام ثم تقوم بتنفيذها من أعلى إلى أسفل.

دعنا نرى مثالاً على البرمجة المنظمة باستخدام برنامج المقهى.

small = 2
regular = 5
big = 6
 
user_budget = input('What is your budget? ')
 
try:
   user_budget = int(user_budget)
except:
   print('Please enter a number')
   exit()
 
if user_budget > 0:
   if user_budget >= big:
       print('You can afford the big coffee')
       if user_budget == big:
           print('It\'s complete')
       else:
           print('Your change is', user_budget - big)
   elif user_budget == regular:
       print('You can afford the regular coffee')
       print('It\'s complete')
   elif user_budget >= small:
       print('You can buy the small coffee')
       if user_budget == small:
           print('It\'s complete')
       else:
           print('Your change is', user_budget - small)

يعمل الرمز أعلاه كبائع مقهى. سيطلب منك ميزانية ، ثم “يبيع” لك أكبر قهوة يمكنك شراؤها.

حاول تشغيله في المحطة . سيتم تنفيذه خطوة بخطوة ، اعتمادًا على إدخالك.

يعمل هذا الرمز بشكل مثالي ، لكن لدينا ثلاث مشاكل:

لديها الكثير من المنطق المتكرر.

ويستخدم العديد من متداخلة إذا الشرطية.

سيكون من الصعب قراءتها وتعديلها.

تم اختراع OOP كحل لكل هذه المشاكل.

دعونا نرى البرنامج أعلاه تم تنفيذه مع OOP. لا تقلق إذا لم تفهمها بعد. إنها فقط لمقارنة البرمجة المهيكلة والبرمجة الموجهة للكائنات.

class Coffee:

class Coffee:
        # Constructor
        def __init__(self, name, price):
                self.name = name
                self.price = float(price)
        def check_budget(self, budget):
                # Check if the budget is valid
                if not isinstance(budget, (int, float)):
                        print('Enter float or int')
                        exit()
                if budget < 0: 
                    print('Sorry you don\'t have money') 
                    exit() 
        def get_change(self, budget):
                return budget - self.price
        
        def sell(self, budget):
                self.check_budget(budget)
                if budget >= self.price:
                        print(f'You can buy the {self.name} coffee')
                        if budget == self.price:
                                print('It\'s complete')
                        else:
                                print(f'Here is your change {self.get_change(budget)}$')

                        exit('Thanks for your transaction')

ملاحظة: سيتم شرح جميع المفاهيم التالية بشكل أعمق من خلال المقالة.

يمثل الرمز أعلاه فئة تسمى “القهوة”. له سمتان – “الاسم” و “السعر” – وكلاهما مستخدم في الطرق. الطريقة الأساسية هي “البيع” ، والتي تعالج كل المنطق اللازم لإكمال عملية البيع.

إذا حاولت تشغيل هذا الفصل ، فلن تحصل على أي ناتج. يحدث هذا في المقام الأول لأننا نعلن فقط “القالب” للقهوة ، وليس القهوة نفسها.

دعنا ننفذ هذه الفئة بالشفرة التالية:

small = Coffee('Small', 2)
regular = Coffee('Regular', 5)
big = Coffee('Big', 6)
 
try:
   user_budget = float(input('What is your budget? '))
except ValueError:
   exit('Please enter a number')
  
for coffee in [big, regular, small]:
   coffee.sell(user_budget)

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

سنحصل على نفس الإخراج مع كلا الأسلوبين ، ولكن يمكننا توسيع وظائف البرنامج بشكل أفضل بكثير باستخدام OOP.

يوجد أدناه جدول يقارن بين البرمجة الشيئية والبرمجة المنظمة:

عفوا       برمجة منظمة

أسهل في الصيانة    يصعب صيانتها

لا تكرر نهج نفسك (جاف)     تكرار الكود في أماكن كثيرة

تم إعادة استخدام أجزاء صغيرة من التعليمات البرمجية في العديد من الأماكن       كمية كبيرة من التعليمات البرمجية في أماكن قليلة

نهج الكائن            نهج كود الكتلة

أسهل في التصحيح  من الصعب التصحيح

منحنى التعلم الكبير  منحنى تعلم أبسط

تستخدم في المشاريع الكبيرة   محسن لبرامج بسيطة

لاختتام المقارنة النموذجية:

لا يوجد نموذج مثالي (يمكن أن يكون OOP ساحقًا للاستخدام في المشاريع البسيطة).

هذه طريقتان فقط لحل مشكلة ؛ هناك آخرون هناك.

يتم استخدام OOP في قواعد الرموز الكبيرة ، بينما تستخدم البرمجة المنظمة بشكل أساسي للمشاريع البسيطة.

دعنا ننتقل إلى الكائنات المضمنة في Python.

كل شيء هو كائن في بايثون

سنخبرك بسر: لقد كنت تستخدم OOP طوال الوقت دون أن تلاحظ ذلك.

حتى عند استخدام نماذج أخرى في Python ، ما زلت تستخدم الكائنات للقيام بكل شيء تقريبًا.

هذا لأنه ، في بايثون ، كل شيء هو كائن.

تذكر تعريف الكائن: الكائن في Python هو مجموعة واحدة من البيانات (السمات) والسلوك (الطرق).

يطابق أي نوع بيانات في Python.

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

قبل المتابعة ، دعنا نراجع معنى السمات والطرق.

السمات والطرق

السمات هي متغيرات داخلية داخل الكائنات ، بينما الطرق هي وظائف تنتج بعض السلوك.

لنقم بتمرين بسيط في قشرة بايثون. يمكنك فتحه عن طريق الكتابة pythonأو python3في جهازك.

Python 3.9 shell يعمل على Linux OS

قذيفة بايثون

الآن ، دعنا نعمل مع Python shell لاكتشاف الأساليب والأنواع.

>>> kinsta = 'Kinsta, Premium WordPress hosting'
>>> kinsta.upper()
'KINSTA, PREMIUM WORDPRESS HOSTING'

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

>>> kinsta
'Kinsta, Premium WordPress hosting'

دعنا نتعمق في الوظائف القيمة عند العمل مع الكائنات.

و النوع () وظيفة تسمح لك للحصول على نوع من كائن. “النوع” هو الفئة التي ينتمي إليها الكائن.

>>> type(kinsta)
# class 'str'

في دير () ترجع الدالة كل سمات وأساليب كائن. دعنا نختبرها باستخدام متغير kinsta .

>>> dir(kinsta)
['__add__', '__class__',  ........... 'upper', 'zfill']

الآن ، حاول طباعة بعض السمات المخفية لهذا الكائن.

 >>> kinsta.__class__ # class ‘str’ e>

سيؤدي هذا إلى إخراج الفئة التي ينتمي إليها الكائن kinsta . لذلك يمكننا أن نقول أن الشيء الوحيد الذي تعرضه دالة النوع هو خاصية __class__ لكائن.

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

هدفك الأول في بايثون

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

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

من ناحية أخرى ، لدينا حالات. المثيل هو كائن فردي من فئة ، له عنوان ذاكرة فريد.

ملف تعريف ارتباط فئة مع مثيلات متعددة ، ملف تعريف الارتباط 1 ، ملف تعريف الارتباط 2 ، ملف تعريف الارتباط 3

مثيلات في بايثون

الآن بعد أن عرفت ما هي الفئات والحالات ، دعنا نحدد بعضها!

لتحديد فئة في Python ، يمكنك استخدام الكلمة الأساسية للفصل متبوعة باسمها. في هذه الحالة ، ستقوم بإنشاء فئة باسم Cookie .

ملاحظة: في Python ، نستخدم اصطلاح اسم حالة الجمل لتسمية الفئات.

class Cookie:
	pass

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

cookie1 = Cookie()

تهانينا ، لقد قمت للتو بإنشاء أول كائن لك في بايثون! يمكنك التحقق من معرفه واكتب الكود التالي:

id(cookie1)
140130610977040 # Unique identifier of the object

type(cookie1)
<class '__main__.Cookie'>

كما ترى ، يحتوي ملف تعريف الارتباط هذا على معرف فريد في الذاكرة ، ونوعه هو ملف تعريف الارتباط .

يمكنك أيضًا التحقق مما إذا كان الكائن هو مثيل لفئة مع وظيفة isinstance () .

isinstance(cookie1, Cookie)
# True
isinstance(cookie1, int)
# False
isinstance('a string', Cookie)
# False
طريقة البناء

و __init __ () يدعى الأسلوب أيضا “منشئ.” يطلق عليه Python في كل مرة نقوم فيها بإنشاء كائن.

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

class Cookie:
	# Constructor
	def __init__(self, name, shape, chips='Chocolate'):
		# Instance attributes
		self.name = name
		self.shape = shape
		self.chips = chips

في كوكي الدرجة، يجب أن يكون كل الكعكة اسما، والشكل، ورقائق البطاطس. لقد عرّفنا آخر واحد على أنه “شوكولاتة”.

من ناحية أخرى ، يشير self إلى مثيل الفئة (الكائن نفسه).

حاول لصق الفئة في الغلاف وإنشاء مثيل لملف تعريف الارتباط كالمعتاد.

cookie2 = Cookie()
# TypeError

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

cookie2 = Cookie('Awesome cookie', 'Star')

للوصول إلى سمات مثيل ، يجب عليك استخدام تدوين النقطة.

cookie2.name
# 'Awesome cookie'
cookie2.shape
# 'Star'
cookie2.chips
# 'Chocolate'

في الوقت الحالي ، لا يحتوي فصل ملفات تعريف الارتباط على أي شيء كثير العصير. دعنا نضيف عينة طريقة bake () لجعل الأمور أكثر إثارة.

class Cookie:
	# Constructor
	def __init__(self, name, shape, chips='Chocolate'):
		# Instance attributes
		self.name = name
		self.shape = shape
		self.chips = chips

	# The object is passing itself as a parameter
	def bake(self):
		print(f'This {self.name}, is being baked with the shape {self.shape} and chips of {self.chips}')
		print('Enjoy your cookie!')

لاستدعاء طريقة ، استخدم تدوين النقطة واستدعها كدالة.

cookie3 = Cookie('Baked cookie', 'Tree')
cookie3.bake()
# This Baked cookie, is being baked with the shape Tree and chips of Chocolate
Enjoy your cookie!

الأركان الأربعة لل OOP في بايثون

تتضمن البرمجة الشيئية أربع ركائز رئيسية:

1. التجريد

يُخفي التجريد الوظائف الداخلية للتطبيق عن المستخدم. يمكن أن يكون المستخدم إما العميل النهائي أو مطورين آخرين.

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

هل تحتاج إلى حل استضافة يمنحك ميزة تنافسية؟ لقد جعلك Kinsta مغطى بسرعة لا تصدق وأحدث مستويات الأمان والتوسع التلقائي. تحقق من خططنا

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

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

2. الميراث

يتيح لنا الوراثة تحديد فئات فرعية متعددة من فئة محددة بالفعل.

والغرض الأساسي منه هو اتباع مبدأ الجفاف . ستتمكن من إعادة استخدام الكثير من التعليمات البرمجية من خلال تنفيذ جميع مكونات المشاركة في الفئات الفائقة .

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

3. تعدد الأشكال

يسمح لنا تعدد الأشكال بتعديل طفيف لطرق وسمات الفئات الفرعية المحددة مسبقًا في الطبقة الفائقة .

المعنى الحرفي هو ” العديد من الأشكال “. هذا لأننا نبني أساليب بنفس الاسم ولكن بوظائف مختلفة.

بالعودة إلى الفكرة السابقة ، يعتبر الأطفال أيضًا مثالًا رائعًا على تعدد الأشكال. يمكنهم أن يرثوا سلوكًا محددًا get_hungry () ولكن بطريقة مختلفة قليلاً ، على سبيل المثال ، الشعور بالجوع كل 4 ساعات بدلاً من كل 6 ساعات.

4. التغليف

التغليف هو العملية التي نحمي فيها السلامة الداخلية للبيانات في الفصل.

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

لنتخيل فئة بشرية لها سمة فريدة تسمى الارتفاع . يمكنك تعديل هذه السمة فقط ضمن قيود معينة (يكاد يكون من المستحيل أن تكون أعلى من 3 أمتار).

بناء حاسبة محلل شكل المنطقة

أحد أفضل الأشياء في Python هو أنه يتيح لنا إنشاء مجموعة متنوعة من البرامج ، من برنامج CLI (واجهة سطر الأوامر) إلى تطبيق ويب معقد.

الآن بعد أن تعلمت المفاهيم الأساسية لـ OOP ، حان الوقت لتطبيقها على مشروع حقيقي.

ملاحظة: ستكون جميع الكودات التالية متاحة داخل مستودع GitHub هذا . A أداة كود المراجعة التي تساعدنا على إدارة الإصدارات الرمز مع جيت.

مهمتك هي إنشاء حاسبة منطقة من الأشكال التالية:

ميدان

مستطيل

مثلث

دائرة

سداسي الزوايا

فئة قاعدة الشكل

أولاً ، قم بإنشاء ملف حاسبة. py وافتحه. نظرًا لأن لدينا بالفعل الكائنات التي نعمل معها ، فسيكون من السهل تجريدها في الفصل.

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

ملاحظة: يجب أن تكون جميع الطرق أفعال. هذا لأن هذه الطريقة تسمى get_area () وليس المنطقة () .

class Shape:
	def __init__(self):
		pass

	def get_area(self):
		pass

يحدد الكود أعلاه الفئة ؛ ومع ذلك ، لا يوجد أي شيء مثير للاهتمام فيه حتى الآن.

دعنا ننفذ الوظائف القياسية لمعظم هذه الأشكال.

class Shape:
	def __init__(self, side1, side2):
		self.side1 = side1
		self.side2 = side2

	def get_area(self):
		return self.side1 * self.side2

	def __str__(self):
		return f'The area of this {self.__class__.__name__} is: {self.get_area()}'

لنفصل ما نفعله بهذا الكود:

في طريقة __init__ ، نطلب معاملين ، side1 و side2 . ستبقى هذه كسمات مثيل .

و get_area () الدالة بإرجاع مجال الشكل. في هذه الحالة ، يستخدم صيغة مساحة المستطيل لأنه سيكون من الأسهل تنفيذه باستخدام الأشكال الأخرى.

طريقة __str __ () هي “طريقة سحرية” تمامًا مثل __init __ (). يسمح لك بتعديل طريقة طباعة المثيل.

و .__ الطبقة __.__ name__ النفس تشير مخفي السمة إلى اسم الفئة. إذا كنت تعمل مع فئة Triangle ، فستكون هذه السمة هي “Triangle”.

فئة المستطيل

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

لتطبيق الوراثة في Python ، ستنشئ فئة كالمعتاد وتحيط بالفئة العليا التي تريد أن ترث منها بالأقواس.

# Folded base class
class Shape: ...
 
class Rectangle(Shape): # Superclass in Parenthesis
	pass
فئة مربعة

يمكننا اتباع نهج ممتاز لتعدد الأشكال مع فئة سكوير .

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

يمكننا القيام بذلك عن طريق تعديل طريقة init ، قبول جانب فقط كمعامل ، وتمرير هذه القيمة الجانبية إلى مُنشئ فئة Rectangle .

# Folded classes
class Shape: ...
class Rectangle(Shape): ...
 
class Square(Rectangle):
	def __init__(self, side):
		super().__init__(side, side)

كما ترى ، تقوم الوظيفة الفائقة بتمرير المعلمة الجانبية مرتين إلى الطبقة العليا . بعبارة أخرى ، يتم تمرير كل من الجانب 1 و side2 إلى المُنشئ المحدد مسبقًا.

فئة المثلث

المثلث نصف حجم المستطيل المحيط به.

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

العلاقة بين المثلثات والمستطيلات (مصدر الصورة: مدرسين اسكواش).

لذلك ، يمكننا أن نرث من فئة المستطيل وتعديل طريقة get_area لتتناسب مع صيغة منطقة المثلث ، والتي تمثل نصف القاعدة مضروبًا في الارتفاع.

# Folded classes
class Shape: ...
class Rectangle(Shape): ...
class Square(Rectangle): ...
 
class Triangle(Rectangle):
	def __init__(self, base, height):
		super().__init__(base, height)
 
	def get_area(self):
		area = super().get_area()
		return area / 2

حالة استخدام أخرى للدالة super () هي استدعاء طريقة محددة في الطبقة العليا وتخزين النتيجة كمتغير. هذا ما يحدث داخل طريقة get_area () .

فئة الدائرة

يمكنك إيجاد مساحة الدائرة بالصيغة πr² ، حيث r هو نصف قطر الدائرة. هذا يعني أنه يتعين علينا تعديل طريقة get_area () لتنفيذ هذه الصيغة.

ملاحظة: يمكننا استيراد القيمة التقريبية لـ π من وحدة الرياضيات

# Folded classes
class Shape: ...
class Rectangle(Shape): ...
class Square(Rectangle): ...
class Triangle(Rectangle): …
 
# At the start of the file
from math import pi
 
class Circle(Shape):
	def __init__(self, radius):
		self.radius = radius
 
	def get_area(self):
		return pi * (self.radius ** 2)

يحدد الكود أعلاه فئة الدائرة ، والتي تستخدم طرق مختلفة منشئ و get_area () .

على الرغم من أن الدائرة ترث من فئة الشكل ، إلا أنه يمكنك إعادة تعريف كل طريقة على حدة وتنسبها حسب رغبتك.

فئة السداسي العادية

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

صيغة منطقة السداسي

صيغة منطقة السداسي (مصدر الصورة: BYJU’S)

ومع ذلك ، فإن الصيغة مختلفة تمامًا ، وهي تعني استخدام الجذر التربيعي. لهذا السبب ستستخدم الدالة sqrt () من وحدة الرياضيات.

# Folded classes
class Shape: ...
class Rectangle(Shape): ...
class Square(Rectangle): ...
class Triangle(Rectangle): …
class Circle(Shape): …
 
# Import square root
from math import sqrt
 
class Hexagon(Rectangle):
	
	def get_area(self):
		return (3 * sqrt(3) * self.side1 ** 2) / 2
اختبار فصولنا

يمكنك الدخول في وضع تفاعلي عند تشغيل ملف Python باستخدام مصحح أخطاء. إن أبسط طريقة للقيام بذلك هي استخدام وظيفة نقطة التوقف المضمنة.

ملاحظة: هذه الوظيفة متاحة فقط في Python 3.7 أو أحدث.

from math import pi, sqrt
# Folded classes
class Shape: ...
class Rectangle(Shape): ...
class Square(Rectangle): ...
class Triangle(Rectangle): …
class Circle(Shape): …
class Hexagon(Rectangle): …
 
breakpoint()

الآن ، قم بتشغيل ملف Python والعب مع الفئات التي أنشأتها.

$ python calculator.py
 
(Pdb) rec = Rectangle(1, 2)(Pdb) print(rec)
The area of this Rectangle is: 2
(Pdb) sqr = Square(4)
(Pdb) print(sqr)
The area of this Square is: 16
(Pdb) tri = Triangle(2, 3)
(Pdb) print(tri)
The area of this Triangle is: 3.0
(Pdb) cir = Circle(4)
(Pdb) print(cir)
The area of this Circle is: 50.26548245743669
(Pdb) hex = Hexagon(3)
(Pdb) print(hex)
The area of this Hexagon is: 23.382685902179844
تحد

قم بإنشاء فئة باستخدام طريقة يتم تشغيلها حيث يمكن للمستخدم اختيار شكل وحساب مساحته.

ملخص

البرمجة الكائنية هي نموذج نحل فيه المشاكل من خلال التفكير فيها ككائنات . إذا كنت تفهم لغة Python OOP ، فيمكنك أيضًا تطبيقها بسهولة في لغات مثل Java و PHP و Javascript و C # .

في هذه المقالة ، تعرفت على:

مفهوم وجوه المنحى في بايثون

مزايا البرمجة الشيئية على البرمجة المهيكلة

أساسيات البرمجة الشيئية في بايثون

مفهوم الفئات وكيفية استخدامها في بايثون

و منشئ للفئة في بيثون

أساليب و سمات في بيثون

الركائز الأربع لـ OOP

تنفيذ التجريد ، والميراث، و تعدد الأشكال في مشروع

توضيح

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

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

شاركنا رايك وتقييمك للموضوع

{{ reviewsTotal }}{{ options.labels.singularReviewCountLabel }}
{{ reviewsTotal }}{{ options.labels.pluralReviewCountLabel }}
{{ options.labels.newReviewButton }}
{{ userData.canReview.message }}