0% found this document useful (0 votes)
3 views6 pages

Classes - We Use Classes To Define New Types. - Cl...

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

Uploaded by

mhmdmfydaldby6
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
3 views6 pages

Classes - We Use Classes To Define New Types. - Cl...

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

Uploaded by

mhmdmfydaldby6
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 6

‫‪ (Object-Oriented‬في بايثون‪ ،‬وهي حجر الزاوية في البرمجة الشيئية )‪" (Classes‬أهالً بك!

دعنا نغوص في عالم "الفئات‬


‫‪Programming - OOP).‬‬

‫في بايثون‪ :‬شرح معمق )‪ (Classes‬الفئات‬


‫تخيل أنك تبني منزالً؛ الفئة هي المخطط ‪" (objects).‬تستخدم إلنشاء "كائنات )‪" (blueprints‬الفئات هي قوالب أو "مخططات‬
‫‪.‬الهندسي للمنزل‪ ،‬والكائن هو المنزل الفعلي الذي تبنيه بنا ًء على هذا المخطط‬
‫الهدف األساسي من الفئات هو تجميع البيانات (السمات‪/‬الخصائص) والوظائف (السلوكيات‪/‬األساليب) التي تعمل على هذه البيانات في‬
‫‪.‬كيان واحد منطقي‪ .‬هذا يجعل الكود أكثر تنظيماً‪ ،‬قابلية إلعادة االستخدام‪ ،‬وسهولة في الصيانة‬

‫المكونات األساسية للفئة‬


‫‪:‬كل فئة تتكون بشكل عام من‬
‫‪.‬هي المتغيرات التي تخزن البيانات المتعلقة بالكائن‪ .‬تمثل "الخصائص" أو "الحاالت" للكائن ‪ (Attributes):‬السمات ​‪1.‬‬
‫‪).‬مختلفة ‪ y‬و ‪ x‬خاصة بكل كائن (كل نقطة لها ‪ (Instance Attributes):‬سمات الكائن ​○‬
‫‪).‬مشتركة بين جميع كائنات الفئة (مثل ثابت ينطبق على جميع النقاط ‪ (Class Attributes):‬سمات الفئة ​○‬
‫هي الدوال المعرفة داخل الفئة‪ .‬تمثل "السلوكيات" أو "اإلجراءات" التي يمكن للكائن القيام بها‪ .‬عندما ‪ (Methods):‬األساليب ​‪2.‬‬
‫‪).‬أسلوب( "‪ "method‬تكون الدالة جزءاً من فئة‪ ،‬فإننا نشير إليها على أنها‬

‫)‪ (Defining a Class‬تعريف الفئة‬


‫‪ :.‬في بايثون)‪ ،‬ثم نقطتين رأسيتين ‪ convention‬متبوعة باسم الفئة (عاد ًة ما يبدأ بحرف كبير‪ ،‬وهو ‪ class،‬تبدأ الفئة بالكلمة المفتاحية‬
‫‪ (Syntax):‬بناء الجملة‬
‫ا_اسم_الفئة‪class :‬‬
‫الفئة( ا‬ ‫ة ‪ #‬‬
‫(‬ ‫)‬ ‫‪# dse_(t_ni_i _eflf, ...): #‬‬ ‫ل‬
‫ئ‪# # )orctruston‬تهي‪(C‬‬

‫‪ # #‬‬ ‫‪#‬‬ ‫‪#‬‬ ‫‪ef d‬‬


‫لبي‬ ‫‪# :)... ,fle‬‬

‫‪ Point:‬مثال الفئة‬
‫​‪class Point:‬‬
‫سمة الفئة (اختياري ‪#‬‬
‫)‬ ‫‪default_co‬‬ ‫ركة‬ ‫ه‬ ‫‪ #d"re"= r lo‬‬ ‫ئ‬

‫‪Point‬‬ ‫‪def __init__(s‬‬ ‫‪# ): y, xf,el‬هذا‬ ‫‪ (C‬‬


‫)‪onstructor‬‬ ‫ ‬ ‫‪# sel‬‬ ‫‪ .ylfse‬هي‬ ‫‪x f.‬‬
‫ ‬
‫‪self.x = x‬‬ ‫ ‬
‫‪ se‬‬
‫‪lf.y = y‬‬ ‫‪def‬‬ ‫‪ #):lfe(svemo‬‬
‫)‪(method‬‬ ‫‪ pr‬‬
‫‪int‬‬
‫)"‪("move‬‬ ‫‪ #:f)el(sawdr‬‬
‫‪def‬‬
‫‪print(f"Drawing a point at ({self.x}, {self.y‬‬
‫‪}) with color {Point.defau‬‬
‫__‪ __init‬األسلوب ‪ (Constructor) -‬ال ُمنشئ‬
‫‪".‬في بايثون يُعرف بـ "المُنشئ )‪ (special method‬هو أسلوب خاص __‪●​ __init‬‬
‫‪.‬يتم استدعاؤه تلقائيا ً في كل مرة يتم فيها إنشاء كائن جديد من الفئة ​●‬
‫‪).‬للنقطة ‪ y‬و ‪ x‬حالة الكائن‪ ،‬أي تعيين قيم أولية لسمات الكائن (مثل )‪ (initialize‬يستخدم لتهيئة ​●‬
‫‪ self.‬يجب أن يكون ‪ __init__،‬البارامتر األول لجميع أساليب الكائن‪ ،‬بما في ذلك ​●‬
‫؟‪ self‬ما هو‬
‫‪ point1 = Point(10,‬هو بارامتر يشير إلى الكائن الحالي الذي يتم إنشاؤه أو الذي يتم استدعاء األسلوب عليه‪ .‬عندما تقوم بـ ‪self‬‬
‫‪5):‬‬
‫‪.‬بايثون تنشئ كائنا ً فارغا ً جديداً ​‪1.‬‬
‫باإلضافة إلى الوسائط األخرى (‪ self، 10‬لهذا الكائن الجديد‪ ،‬وتمرر الكائن نفسه كقيمة للبارامتر __‪ __init‬تستدعي األسلوب ​‪2.‬‬
‫‪ y).‬و ‪ 5‬لـ ‪ x‬لـ‬
‫‪ x".‬تساوي القيمة التي تم تمريرها لـ )‪ (self‬الخاصة بهذا الكائن ‪ x‬تعني "اجعل سمة ‪ __init__، self.x = x‬داخل ​‪3.‬‬

‫)‪ (Creating Objects / Instances‬إنشاء الكائنات‬


‫‪:‬إلنشاء كائن من فئة‪ ،‬تستدعي الفئة كما لو كانت دالة‬
‫​)‪ (instance‬إنشاء الكائن األول ‪point1 = Point(10, 5) #‬‬
‫​)‪ (instance‬إنشاء الكائن الثاني ‪point2 = Point(2, 4) #‬‬

‫‪:‬الشرح‬
‫‪ Point.‬من الفئة )‪ (instances‬هما اآلن كائنات مستقلة ‪ point2‬و ‪●​ point1‬‬
‫‪ y=4.‬و ‪ x=2‬لديه ‪ point2‬بينما ‪ y=5،‬و ‪ x=10‬لديه ‪: point1‬كل كائن له سماته الخاصة ​●‬

‫‪ (Accessing Attributes and Calling‬الوصول إلى السمات واستدعاء األساليب‬


‫)‪Methods‬‬
‫‪.‬تستخدم "نقطة" (‪ ).‬للوصول إلى سمات الكائن أو استدعاء أساليبه‬
‫)‪print(point1.x‬‬ ‫‪0‬الناتج‪ point1 ( 1::‬الخاصة بـ '‪ 'x‬الوصول إلى السمة ‪#‬‬
‫)‪print(point2.y‬‬ ‫‪#‬‬ ‫'‪'y‬‬ ‫‪point2 :‬‬

‫)(‪point1.move‬‬ ‫ ‪#‬استدعا لاأسلو‬ ‫ 'عل‪'move‬‬ ‫( النات‪point1‬‬ ‫‪: mov‬‬


‫)(‪point2.draw‬‬ ‫ ‪#‬استدعا لاأسلو‬ ‫ 'عل‪'draw‬‬ ‫( النات‪point2‬‬ ‫‪: Drawing‬‬
‫‪a point at (2, 4) with color re‬‬

‫ن ‪#‬تغيي سم الكائ‬


‫= ‪point1.x‬‬
‫)‪print(point1.x‬‬ ‫‪:‬‬ ‫‪# 15‬النات‬
‫​‬
‫ة‬ ‫ى‬ ‫ل‬
‫)‪print(Point.default_color‬‬ ‫‪ #‬‬ ‫‪: red‬‬
‫ة "‪point1.default_color = "blue‬‬ ‫ن‬ ‫ة‬ ‫ئ‬ ‫ل‬ ‫‪،‬‬ ‫ة‬ ‫ر‬ ‫ن‬ ‫ا‬ ‫‪ #‬‬
‫!ط ‪poin t1‬‬
‫)‪print(point1.default_color‬‬ ‫‪ #‬‬ ‫‪: blue‬‬
‫)‪print(point2.default_color‬‬ ‫‪ #‬‬ ‫‪: re‬‬ ‫م‬ ‫)ر ‪d‬‬
‫)‪print(Point.default_color‬‬ ‫لم تتأثر)( ‪: red‬الناتج ‪#‬‬

‫‪#‬‬
‫‪Point.default_color = "green‬‬
‫‪print(point1.default_color) #‬‬ ‫‪: blue‬‬ ‫ل(‬
‫‪print(point2.default_color) #‬‬ ‫‪: green‬‬
‫‪print(Point.default_color) #‬‬ ‫‪: gree‬‬

‫الفرق بين سمات الكائن وسمات الفئة‬


‫‪ (Instance Attributes):‬سمات الكائن ​●‬
‫‪ self.attribute_name.‬باستخدام __‪ __init‬تعرف عادة داخل ​○‬
‫‪.‬قيمتها فريدة لكل كائن ​○‬
‫‪ Point.‬في فئة ‪: self.x, self.y‬مثال ​○‬
‫‪ (Class Attributes):‬سمات الفئة ​●‬
‫‪.‬تعرف مباشرة داخل الفئة ولكن خارج أي أسلوب ​○‬
‫‪.‬قيمتها مشتركة بين جميع كائنات الفئة ​○‬
‫‪.‬تستخدم للقيم الثابتة أو االفتراضية التي تنطبق على جميع الكائنات ​○‬
‫‪ Point.‬في فئة "‪: default_color = "red‬مثال ​○‬
‫‪ Point.default_color).‬يتم الوصول إليها باستخدام اسم_الفئة‪.‬اسم_السمة (مثل ​○‬

‫)‪ (Special Methods / Dunder Methods‬أساليب خاصة‬


‫هناك العديد من األساليب الخاصة في بايثون التي تبدأ وتنتهي بشرطتين سفليتين (__)‪ .‬هذه األساليب تمنح الفئات قدرات خاصة وتجعلها‬
‫‪ __init__).‬تتصرف بطرق معينة (مثل‬
‫__‪: __str‬مثال آخر‬
‫أو )‪ print(object‬يتم استدعاؤه عندما تحاول تحويل الكائن إلى سلسلة نصية (مثالً عند استدعاء ‪●​ __str__(self):‬‬
‫‪.‬يجب أن ترجع سلسلة نصية تمثل الكائن بطريقة قابلة للقراءة ‪str(object)).‬‬
‫​‪class Point:‬‬
‫​‪def __init__(self, x, y):‬‬
‫​‪self.x = x‬‬
‫​‪self.y = y‬‬
‫​‬
‫​‪def __str__(self):‬‬
‫​")}‪return f"Point(x={self.x}, y={self.y‬‬
‫​‬
‫​‪def distance_from_origin(self):‬‬
‫​‪return (self.x**2 + self.y**2)**0.5‬‬
‫​‬
‫​)‪p = Point(3, 4‬‬
‫​)__‪ __str‬بفضل( )‪: Point(x=3, y=4‬الناتج ‪print(p) #‬‬
‫الناتج‪: {p.distance_from_origin()}") # 5.::‬المسافة من نقطة األصل"‪print(f‬‬

‫)‪ (OOP Principles‬مبادئ البرمجة الشيئية‬


‫‪:‬الفئات هي أساس البرمجة الشيئية التي تقوم على أربعة مبادئ رئيسية‬
‫تجميع البيانات (السمات) والوظائف (األساليب) التي تعمل عليها في وحدة واحدة (الفئة)‪ .‬هذا ‪ (Encapsulation):‬التغليف ​‪1.‬‬
‫‪.‬يحمي البيانات من الوصول غير المصرح به أو التغيير غير المقصود‬
‫إظهار فقط المعلومات األساسية للمستخدم وإخفاء التفاصيل الداخلية المعقدة‪( .‬عند استخدام كائن ‪ (Abstraction):‬التجريد ​‪2.‬‬
‫‪).‬بالضبط‪ ،‬فقط أنك تستطيع الوصول إليها ‪ y‬و ‪ x‬ال تحتاج إلى معرفة كيف يتم تخزين ‪Point،‬‬
‫السماح لفئة (الفئة الفرعية‪/‬المشتقة) باكتساب السمات واألساليب من فئة أخرى (الفئة ‪ (Inheritance):‬الوراثة ​‪3.‬‬
‫‪.‬األساسية‪/‬األصل)‪ .‬هذا يعزز إعادة استخدام الكود‬
‫‪.‬السماح لكائنات من فئات مختلفة باالستجابة لنفس االستدعاء بطرق مختلفة ‪ (Polymorphism):‬تعدد األشكال ​‪4.‬‬

‫تمارين محلولة‬
‫‪ Book‬تمرين ‪ :1‬فئة‬
‫عدد الصفحات)‪ .‬قم بإنشاء مُنشئ لتهيئة هذه( ‪ pages‬مؤلف)‪ ،‬و( ‪)، author‬عنوان( ‪ title‬تحتوي على السمات ‪ Book‬اكتب فئة‬
‫‪.‬يطبع تفاصيل الكتاب ‪ get_info‬السمات‪ .‬أضف أسلوبا ً‬
‫‪:‬الحل‬
‫​‪class Book:‬‬
‫​‪def __init__(self, title, author, pages):‬‬
‫​‪self.title = title‬‬
‫​‪self.author = author‬‬
‫​‪self.pages = pages‬‬
‫​‬
‫​‪def get_info(self):‬‬
‫​)"}‪: {self.title‬العنوان"‪print(f‬‬
‫​)"}‪: {self.author‬المؤلف"‪print(f‬‬
‫​)"}‪: {self.pages‬عدد الصفحات"‪print(f‬‬
‫​‬
‫​‪ Book‬إنشاء كائنات من فئة ‪#‬‬
‫‪book1 = Book("The Hitchhiker's Guide to the Galaxy", "Douglas Adams",‬‬
‫​)‪193‬‬
‫​)‪book2 = Book("Pride and Prejudice", "Jane Austen", 279‬‬
‫​‬
‫​‪ get_info‬استدعاء األسلوب ‪#‬‬
‫​)(‪book1.get_info‬‬
‫​)‪print("-" * 20‬‬
‫​)(‪book2.get_info‬‬

‫مع سمة فئة ‪ Car‬تمرين ‪ :2‬فئة‬


‫بقيمة ‪ wheel_count‬الموديل)‪ .‬أضف سمة فئة( ‪ model‬الشركة المصنعة) و( ‪ make‬تحتوي على سمات الكائن ‪ Car‬اكتب فئة‬
‫‪.‬يطبع معلومات السيارة وعدد العجالت ‪ display_car_info‬افتراضية ‪ .4‬أضف أسلوبا ً‬
‫‪:‬الحل‬
‫​‪class Car:‬‬
‫​سمة فئة ‪wheel_count = 4 #‬‬
‫​‬
‫​‪def __init__(self, make, model):‬‬
‫​‪self.make = make‬‬
‫​‪self.model = model‬‬
‫​‬
‫​‪def display_car_info(self):‬‬
print(f"‫الشركة المصنعة‬: {self.make}")​
print(f"‫الموديل‬: {self.model}")​
print(f"‫عدد العجالت‬: {Car.wheel_count}") # ‫​الوصول إلى سمة الفئة‬

‫ إنشاء كائنات‬#​
car1 = Car("Toyota", "Camry")​
car2 = Car("Honda", "Civic")​

# ‫​عرض المعلومات‬
car1.display_car_info()​
print("-" * 20)​
car2.display_car_info()​

# ‫​تغيير سمة الفئة‬
Car.wheel_count = 6 # ‫​مثال ً لو كانت شاحنة‬
print("\n6 ‫بعد تغيير عدد العجالت إلى‬:")​
car1.display_car_info()​
car2.display_car_info()​

‫ فئة‬:3 ‫ تمرين‬Circle ‫__ مع أسلوب خاص‬str__


‫ اكتب فئة‬Circle ‫ تأخذ‬radius (ً ‫ أضف أسلوبا‬.‫ نصف القطر) كبارامتر في المُنشئ‬calculate_area ‫( يحسب مساحة الدائرة‬A =
\pi r^2). ً ‫__ أضف أسلوبا ً خاصا‬str__ ‫ (استخدم‬.‫ لتمثيل الكائن بشكل نصي‬import math ‫\ للحصول على قيمة‬pi)
‫الحل‬:
import math​

class Circle:​
def __init__(self, radius):​
if not isinstance(radius, (int, float)) or radius <= 0:​
raise ValueError("‫نصف القطر يجب أن يكون رقمًا موجبًا‬.")​
self.radius = radius​

def calculate_area(self):​
return math.pi * (self.radius ** 2)​

def __str__(self):​
return f"‫{ = دائرة بنصف قطر‬self.radius}"​

# ‫​إنشاء كائنات‬
circle1 = Circle(5)​
circle2 = Circle(3.5)​

# ‫طباعة الكائنات (تستخدم‬
__str__) print ‫ب‬ ‫دائ‬: # ) e1clir(c‫ ف‬
= 5 prin ‫رة‬ ‫ النات‬#2)lerccit(

.5 3 = ‫ا‬
(ftinpr 1: {circle1.calculate_area() f.2# ) }"2f:.
‫ع‬
‫​)"}‪: {circle2.calculate_area():.2f‬مساحة الدائرة ‪print(f"2‬‬
‫​‬
‫​‪try:‬‬
‫​‪ ValueError‬سيثير ‪invalid_circle = Circle(-2) #‬‬
‫​‪except ValueError as e:‬‬
‫​)"}‪: {e‬خطأ"‪print(f‬‬

‫)!تمارين غير محلولة (حاول حلها بنفسك‬


‫‪ BankAccount‬تمرين ‪ :1‬فئة‬
‫الرصيد)‪ .‬قم بإنشاء مُنشئ( ‪ balance‬رقم الحساب) و( ‪ account_number‬تحتوي على السمات ‪ BankAccount‬اكتب فئة‬
‫‪:‬لتهيئة هذه السمات (الرصيد االفتراضي يجب أن يكون ‪ .)0‬أضف أسلوبين‬
‫‪.‬لزيادة الرصيد ‪●​ deposit(amount):‬‬
‫لتقليل الرصيد‪ ،‬مع التأكد من أن الرصيد ال يصبح سالبا ً (ال تسمح بالسحب إذا لم يكن هناك رصيد ‪●​ withdraw(amount):‬‬
‫‪).‬كا ٍ‬
‫ف‬
‫‪ Student‬تمرين ‪ :2‬فئة‬
‫الدورات)‪ .‬أضف( ‪ courses‬رقم الهوية) وقائمة فارغة( ‪ id_number‬االسم) و( ‪ name‬تحتوي على السمات ‪ Student‬اكتب فئة‬
‫إلضافة دورة إلى قائمة الدورات‪ .‬أضف أسلوبا ً )‪ enroll_course(course_name‬مُنشئا ً لتهيئة االسم ورقم الهوية‪ .‬أضف أسلوبا ً‬
‫‪.‬يطبع جميع الدورات التي التحق بها الطالب )(‪display_courses‬‬
‫مع أساليب للحساب ‪ Rectangle‬تمرين ‪ :3‬فئة‬
‫)(‪ calculate_area‬االرتفاع) كبارامترات في المُنشئ‪ .‬أضف أسلوبا ً( ‪ height‬العرض) و( ‪ width‬تأخذ ‪ Rectangle‬اكتب فئة‬
‫__‪ __repr‬لحساب محيط المستطيل‪ .‬أضف أسلوبا ً خاصا ً )(‪ calculate_perimeter‬لحساب مساحة المستطيل‪ .‬أضف أسلوبا ً‬
‫‪: Rectangle(width=w, height=h)).‬لتمثيل الكائن بشكل نصي مفيد للمطورين (مثالً‬
‫مع سمات افتراضية ‪ Employee‬تمرين ‪ :4‬فئة‬
‫أضف سمة فئة ‪ Staff.‬ذات قيمة افتراضية ‪ position‬اجعل ‪ position.‬و ‪ name‬تحتوي على السمات ‪ Employee‬اكتب فئة‬
‫يطبع اسم الموظف‪ ،‬وظيفته‪ ،‬واسم ‪ get_employee_details‬أضف أسلوبا ً ‪ "Global Tech".‬بقيمة ‪company_name‬‬
‫‪.‬الشركة‬
‫‪ TemperatureConverter‬تمرين ‪ :5‬فئة‬
‫أضف أسلوب فئة ‪ __init__).‬في ‪ pass‬ال تحتاج إلى سمات في المُنشئ (أو يمكنك استخدام ‪ TemperatureConverter‬اكتب فئة‬
‫يقوم بالتحويل ويرجع القيمة‪ .‬أضف أسلوب فئة )‪(@classmethod) celsius_to_fahrenheit(celsius‬‬
‫يقوم بالتحويل ويرجع القيمة‪( .‬تلميح‪ :‬استخدم )‪(@classmethod) fahrenheit_to_celsius(fahrenheit‬‬
‫‪).‬فوق األسلوب ‪@classmethod‬‬
‫!فهم الفئات والبرمجة الشيئية سيفتح لك آفاقا ً جديدة في بناء تطبيقات معقدة ومنظمة‪ .‬استمر في الممارسة‬

You might also like