recent
أخبار ساخنة

الوراثة inheritance و أشكالها في بايثون Python الدرس |29|

الصفحة الرئيسية
python inheritance
 

مفهوم الوراثة في بايثون python inheritance

الوراثة inheritance كما هو الحال المتعارف عليه في ارض الواقع. أن يَرِث الإبن child من أبيه parent بعض الصفات او من أمه بعض الصفات., بنفس الأمر لدينا في البرمجة الكائنية oop أو  object oriented programming في مفهوم الوراثة inheritance. و هو أن يَرِث كلاس من كلاس آخر حيث أن الكلاس الوارث يسمى الإبن و كلاس المورث يسمى الأب. بحيث أن الإبن يستطيع الوصول لكافة الدوال و المُتغيرات الموجودة في كلاس الأب و إعادة إستخدامها مرة أخرى.

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

الشكل العام للوراثة Syntax

class BaseClass:
Body class
class الكلاس المشتق(BaseClass):
جسم الكلاس المشتق

 

إنشاء كلاس أب parent class في بايثون

يمكن لأي كلاس بأن يكون أب (parent) فإن بناء الجملة هو نفسه كإنشاء أي كلاس آخر

class Info:
def __init__ (self, name = "Muhammad Alush", age = 28):
self.name = name
self.age = age
def my_info (self,data = "My Info"):
print ("I am Programmer")
print (data)
c = Info ("Muhammad", "26")
c.my_info ("data : ")
print (c.name)
print (c.age)


إنشاء كلاس ابن child class في بايثون

لإنشاء كلاس إبن ترث الدالة من كلاس آخر, يجب إرسال الكلاس الرئيسي كـ باراميتر Parameter عند إنشاء كلاس فرعي

class another_user(user):
pass

سوف يكون للكلاس الذي يسمى user نفس الخصائص و الأساليب لدى another_user و يتم إستخدام كلمة pass عندما لا نريد إضافة أي دوال أو خصائص إلى الكلاس.

 

أشكال الوراثة في بايثون (انواعها)

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


1 - الوراثة الفردية (single Inheritance)

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

single Inheritance python
 

سوف نقوم بإنشاء ملفين الأول هو الأب ونسميه main. و الثاني هو الإبن و نسميه index. 

الملف الأول main

#file main.py
class Human:
'''this class for human'''
skin_color = 'black'
hair_color = 'black'
eye_color = 'blue'
def print_skin_color(self):
return "your skin color is {}".format(self.skin_color)
def print_hair_color(self):
return f"my hair color is {self.hair_color}"
def print_eye_color(self):
return f"my eye color {self.eye_color}"

أنشأنا كلاس بإسم Human و هو الكلاس الأب, ثم أنشأنا له عدة خصائص أو صفات و هي لون البشرة و لون الشعر و لون العيون. ثم أعطيناه بعض الوظائف و هي طباعة لون البشرة print_skin_color و هذه الميثود تقوم بإرجاع لون البشرة و نسقنا العملية عبر إستخدام format. و الوظيفة الثانية هي طباعة لون الشعر و الوظيفة الثالثة طباعة لون العينين.


الملف الثاني index

#file index.py
from main import Human
class Person(Human):
pass
app = Person()
result = app.print_eye_color()
print(result)

كتبنا from من أجل إستدعاء المكتبة أي الملف الأب main إجلب لي الكلاس Human ثم أنشانا كلاس الإبن بإسم Person و توريثه من الكلاس الأب Human و وضعنا pass من أجل عدم إضافة أي شيئ له. بعدها نعتبر أن الأب قد مات و أنشانا كائن app و عيينا له Person و أنشانا متغير result بعدها إستطاع الإبن الوصول للصفة التي ورثّها له الأب و هي print_eye_color و نفس الأمر سيستطيع الوصول لكل شيئ في الأب, ثم طبعنا المُتغير result.

عندما نقوم بتشغيل هذا الكود سنلاحظ النتيجة الآتية و هي

#result النتيجة
my eye color blue


2 - الوراثة المتعددة (multiple Inheritance)

تعني عندما ترث فئة من فئات متعددة أو بمعنى أصح أن يرث الكلاس من أكثر من كلاس.

multiple Inheritance python
 

class Saja(object): 
def __init__(self):
self.str1 = "Curious"
print("Saja")
class Muhammad(object):
def __init__(self):
self.str2 = "Crazy"
print("Muhammad")
class Derive(Saja, Muhammad):
def __init__(self):
Saja.__init__(self)
Muhammad.__init__(self)
print("Derive")
def printStrs(self):
print(self.str1, self.str2)
ob = Derive()
ob.printStrs()

أنشأنا كلاس أول و هو Saja و أضفنا __init__ من أجل إضافة خواص لهذا الكلاس و أضفنا له الخاصية Curious أي أنه فضولي ثم طلبنا طباعة الكلاس عن طريق إستدعاء إسمه, و أنشأنا كلاس آخر وهو Muhammad و أيضاً أضفنا له خاصية أنه مجنون Crazy و بعد ذلك قُمنا بإشتقاق كلاس إبن يَرِث من الأبوين Saja و Muhammad.

عندما نقوم بتشغيل هذا الكود سنلاحظ النتيجة الآتية و هي

Saja
Muhammad
Derive
Curious Crazy

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

 

3 - الوراثة متعددة المستويات (Multilevel inheritance)

تعني عندما يكون لدينا عدة أصناف مثل جد و أب و حفيد. يعني أن الكلاس سوف يرث من أكثر من كلاس.

Multilevel inheritance python

class Base(object): 
#Constructor
def __init__(self, name):
self.name = name
#Name
def Name(self):
return self.name
class Child(Base):
#Constructor
def __init__(self, name, age):
Base.__init__(self, name)
self.age = age
#age
def Age(self):
return self.age
class GrandChild(Child):
#Constructor
def __init__(self, name, age, address):
Child.__init__(self, name, age)
self.address = address
#address
def Address(self):
return self.address
g = GrandChild("Saja", 27, "Sudan")
print(g.Name(), g.Age(), g.Address())

تم إنشاء كلاس جد و هو Base و يتضمن الأسم name و كلاس أب بإسم Chile و تضمن هذا الكلاس العمر age و الكلاس الأخير هو الحفيد و يرث هذا الحفيد من أبيه و جده الإسم و العمر إضافةً على ذلك لديه صفه العنوان, ثم قُمنا بطباعة الحفيد و كان يملك ثلاث خواص أحدها من أبيه و الأُخرى من جده و الأخيره هي به.

و عند تنفيذ الكود السابق

Saja 27 Sudan 

 

4 - الوراثة الهرمية (Hierarchical inheritance)

يعني إنشاء اكثر من فئة من قاعدة واحدة أو بمعنى أصَح أن هذا الكلاس موروث من أكثر من كلاس.

Hierarchical inheritance python
 

#الكلاس الأساسي
class MyWebsite:
def programmer(self, name):
self.name = name
print(f'{self.name} Is Programming')
#كلاس فرعي1
class MuhammadAlush(MyWebsite):
pass
#كلاس فرعي2
class AhmedKaissar(MyWebsite):
pass
data = MuhammadAlush()
data.programmer("MuhammadAlush")
ahmed = AhmedKaissar()
ahmed.programmer("AhmedKaissar")
#لا توجد أي علاقة بين الكلاس الفرعي1 و الكلاس الفرعي2

يوجد لدينا كلاس أساسي و هو MyWebsite و به داله progammer و كلاسين فرعيات و هما MuhammadAlush و الكلاس الآخر AhmedKaissar لكن كما نرى لا توجد أي علاقة بين الكلاسين الفرعيات و قد ورثوا من الأب أنهم مبرمجين.

و عند تشغيل الكود السابق ستكون نتيجة هي

MuhammadAlush Is Programming
AhmedKaissar Is Programming


5 - الوراثة الهجينة (Hybrid inheritance)

يكون هذا النوع مزيج من اكثر من نوع من انواع الوراثة

Hybrid inheritance python
 

class AdminWebsite:
def func1(self):
print("This function is Main.")
class MuhammedAlush(AdminWebsite):
def func2(self):
print("This function is MuhammadAlush. ")
class AhmadKaissar(AdminWebsite):
def func3(self):
print("This function is AhmedKaissar.")
class SajaAlsadig(MuhammedAlush, AdminWebsite):
def func4(self):
print("This function is SajaAlsadig.")
# Driver's code
object = SajaAlsadig()
object.func1()
object.func2()


و عند تشغيل الكود السابق

This function is Main.
This function is MuhammadAlush.


google-playkhamsatmostaqltradent