بايثون3 مِن مدارس w3-26Python Inheritance
اقتبس من ابراهيم حمادة في 21 أبريل، 2021, 1:40 متنويه:
لِأن التاب لا تظهر على الصفحة, و هي شيء مهم جدا في الإزاحة في كود بايثون
لذلك فإننا سنستبدل التاب بالكلمة 'tab' على هذه الصفحة
و مِن الأفضل إذا شئت أن تنسخ أي كود, أن تأخذه مِن الملف النصي, أو الملفات المُرفقة.
الوراثة بالنسبة للفئات والكائنات في بايثونالوراثة في بايثون(Python Inheritance)
تسمح لنا الوراثة في بايثون بتعريف فئة ترثُ جميع الوظائف والخصائص مِن فئة أخرى.
فئةْ الأصل(Parent class) هي الفئة الموروثة منها ، وتسمى أيضًا الفئة الأساسية(base class).
الفئة الفرعية(Child class) هي الفئة التي ترث من فئة أخرى ، وتسمى أيضًا الفئة المشتقة(derived class).إنشاء فئةْ الأصل(Parent Class)
يمكن أن تكون أي فئة فئة أصل، وبالتالي فإن الطريقة هي نفسها كإنشاء أي فئة أخرى:
مثال
إنشاء فئة تسمى Person، مع الخصائص firstnameو lastname، و الوظيفة printname:
class Person:
tab def __init__(self, fname, lname):
tab tab self.firstname = fname
tab tab self.lastname = lnametab def printname(self):
tab tab print(self.firstname, self.lastname)#Use the Person class to create an object, and then execute the printname method:
x = Person("John", "Doe")
x.printname()ستكون النتيجة:
John Doe
جربها بنفسك مِن ملف inheritance_parent.pyإنشاء فئة تابعة(Child Class)
لإنشاء فئة ترث الخصائص و الوظائف مِن فئة أخرى ، إجعل الفئة الأصل كمعامل عند إنشاء الفئة الفرعية:
مثال
إنشاء فئة باسم Student، والتي سترث الخصائص والوظائف من الفئة Person:
class Student(Person):
tab pass
ملاحظة: استخدم الكلمة الرئيسية pass عندما لا ترغب في إضافة أي خصائص أو طرق أخرى إلى الفئة.
الآن فئة Student لها نفس الخصائص والأساليب مثل فئة Person.مثال
استخدم فئة Student لإنشاء كائن ، ثم قم بتنفيذ الوظيفة printname:
class Person:
tab def __init__(self, fname, lname):
tab tab self.firstname = fname
tab tab self.lastname = lnametab def printname(self):
tab tab print(self.firstname, self.lastname)class Student(Person):
tab passx = Student("Mike", "Olsen")
x.printname()ستكون النتيجة:
Mike Olsen
جربها بنفسك مِن ملف inheritance_child.pyإضافة وظيفة __init __ ()
لقد أنشأنا حتى الآن فئة فرعية(child class) ترث الخصائص والطرق من أصلها(parent).
نريد إضافة الوظيفة __init__() إلى الفئة الفرعية(child class) بدلاً من الكلمة الأساسية pass.
ملاحظة: يتم استدعاء الدالة __init__() تلقائياً في كل مرة يتم استخدام الفئة لإنشاء كائن جديد.مثال
إضافة الدالة __init__() إلى فئة Student
class Student(Person):
tab def __init__(self, fname, lname):
tab tab #add properties etc.
عند إضافة الدالة__ init _ _ () ، إلى الفئة الفرعية(child class), لن ترث الفئة الفرعية الدالة __init _ _ () الخاصة بفئةْ الأصل أو الوالد(parent class).
ملاحظة:وظيفة الفئة الفرعية __init__() تتجاوز أو تُلغي وراثة الوظيفة __init__() في الفئة الأصل .
للاحتفاظ بوراثة الدالة __init__() مِن الفئة الأصل، أضف إلى دالة الفئة الفرعية استدعاء دالة __init__() لفئةْ الأصل:
مثال
class Person:
tab def __init__(self, fname, lname):
tab tab self.firstname = fname
tab tab self.lastname = lnametab def printname(self):
tab tab print(self.firstname, self.lastname)class Student(Person):
tab def __init__(self, fname, lname):
tab tab Person.__init__(self, fname, lname)x = Student("Mike", "Olsen")
x.printname()ستكون النتيجة:
Mike Olsen
جربها بنفسك مِن ملف inheritance_init.py
الآن لقد أضفنا بنجاح وظيفة __init__ () ، وحافظنا على وراثة الفئة الأصل ، ونحن على استعداد لإضافة وظائف أخرى في وظيفة __init__ ().استخدام الوظيفة super ()
تحتوي لغة Python أيضًا على وظيفة super() تجعل الفئة الفرعية ترث جميع الوظائف والخصائص من الفئة الأصل:
مثال
class Person:
tab def __init__(self, fname, lname):
tab tab self.firstname = fname
tab tab self.lastname = lnametab def printname(self):
tab tab print(self.firstname, self.lastname)class Student(Person):
tab def __init__(self, fname, lname):
tab tab super().__init__(fname, lname)x = Student("Mike", "Olsen")
x.printname()ستكون النتيجة:
Mike Olsen
جربها بنفسك مِن ملف inheritance_super.py
باستخدام الدالة super() لا نحتاج إلى استخدام اسم العنصر الأصل، فإننا سنرث الأساليب والخصائص تلقائياً من الأصل.إضافة خصائص إلى الفئة الفرعية
مثال
إضافة خاصية تسمى graduationyear إلى فئة Student
class Person:
tab def __init__(self, fname, lname):
tab tab self.firstname = fname
tab tab self.lastname = lnametab def printname(self):
tab tab print(self.firstname, self.lastname)class Student(Person):
tab def __init__(self, fname, lname):
tab tab super().__init__(fname, lname)
tab tab self.graduationyear = 2019x = Student("Mike", "Olsen")
print(x.graduationyear)ستكون النتيجة:
2019
جربها بنفسك مِن ملف inheritance_add_prop.pyفي المثال أدناه ، العام 2019 يجب أن يكون متغيرًا ، ويتم تمريره إلى الفئة Student عند إنشاء عناصر مِن Student.
للقيام بذلك ، أضف معامِل آخر في دالة __init __ ():
مثال
إضافة معامِل year وتمرير السنة الصحيحة عند إنشاء الكائنات:
class Person:
tab def __init__(self, fname, lname):
tab tab self.firstname = fname
tab tab self.lastname = lnametab def printname(self):
tab tab print(self.firstname, self.lastname)class Student(Person):
tab def __init__(self, fname, lname, year):
tab tab super().__init__(fname, lname)
tab tab self.graduationyear = yearx = Student("Mike", "Olsen", 2019)
print(x.graduationyear)ستكون النتيجة:
2019
جربها بنفسك مِن ملف inheritance_add_prop2.pyإضافة وظائف إلى الفئة الفرعية
مثال
إضافة وظيفة تسمى welcome إلى فئة Student
class Person:
tab def __init__(self, fname, lname):
tab tab self.firstname = fname
tab tab self.lastname = lnametab def printname(self):
tab tab print(self.firstname, self.lastname)class Student(Person):
tab def __init__(self, fname, lname, year):
tab tab super().__init__(fname, lname)
tab tab self.graduationyear = yeartab def welcome(self):
tab tab print("Welcome", self.firstname, self.lastname, "to the class of", self.graduationyear)x = Student("Mike", "Olsen", 2019)
x.welcome()ستكون النتيجة:
Welcome Mike Olsen to the class of 2019
جربها بنفسك مِن ملف inheritance_add_method.pyإذا قمتَ بإضافة وظيفة في الفئة الفرعية بنفس اسم الدالة في الفئة الأصل(parent class) ، فسيتم تجاوز وراثة الوظيفة الأصل.
يعني إذا أنشأنا في هذه الحالة, كائناً مِن الفئة الفرعية, فإنّ وظيفة الأصل لا تعود تعمل عليه, بَل فقط الوظيفة الجديدة في الفئة الفرعية.الدرس مع الملفات المُرفقة:
https://www.dropbox.com/s/qww6gdzfz48hoja/26Python%20Inheritance.zip?dl=1
تنويه:
لِأن التاب لا تظهر على الصفحة, و هي شيء مهم جدا في الإزاحة في كود بايثون
لذلك فإننا سنستبدل التاب بالكلمة 'tab' على هذه الصفحة
و مِن الأفضل إذا شئت أن تنسخ أي كود, أن تأخذه مِن الملف النصي, أو الملفات المُرفقة.
الوراثة بالنسبة للفئات والكائنات في بايثون
الوراثة في بايثون(Python Inheritance)
تسمح لنا الوراثة في بايثون بتعريف فئة ترثُ جميع الوظائف والخصائص مِن فئة أخرى.
فئةْ الأصل(Parent class) هي الفئة الموروثة منها ، وتسمى أيضًا الفئة الأساسية(base class).
الفئة الفرعية(Child class) هي الفئة التي ترث من فئة أخرى ، وتسمى أيضًا الفئة المشتقة(derived class).
إنشاء فئةْ الأصل(Parent Class)
يمكن أن تكون أي فئة فئة أصل، وبالتالي فإن الطريقة هي نفسها كإنشاء أي فئة أخرى:
مثال
إنشاء فئة تسمى Person، مع الخصائص firstnameو lastname، و الوظيفة printname:
class Person:
tab def __init__(self, fname, lname):
tab tab self.firstname = fname
tab tab self.lastname = lname
tab def printname(self):
tab tab print(self.firstname, self.lastname)
#Use the Person class to create an object, and then execute the printname method:
x = Person("John", "Doe")
x.printname()
ستكون النتيجة:
John Doe
جربها بنفسك مِن ملف inheritance_parent.py
إنشاء فئة تابعة(Child Class)
لإنشاء فئة ترث الخصائص و الوظائف مِن فئة أخرى ، إجعل الفئة الأصل كمعامل عند إنشاء الفئة الفرعية:
مثال
إنشاء فئة باسم Student، والتي سترث الخصائص والوظائف من الفئة Person:
class Student(Person):
tab pass
ملاحظة: استخدم الكلمة الرئيسية pass عندما لا ترغب في إضافة أي خصائص أو طرق أخرى إلى الفئة.
الآن فئة Student لها نفس الخصائص والأساليب مثل فئة Person.
مثال
استخدم فئة Student لإنشاء كائن ، ثم قم بتنفيذ الوظيفة printname:
class Person:
tab def __init__(self, fname, lname):
tab tab self.firstname = fname
tab tab self.lastname = lname
tab def printname(self):
tab tab print(self.firstname, self.lastname)
class Student(Person):
tab pass
x = Student("Mike", "Olsen")
x.printname()
ستكون النتيجة:
Mike Olsen
جربها بنفسك مِن ملف inheritance_child.py
إضافة وظيفة __init __ ()
لقد أنشأنا حتى الآن فئة فرعية(child class) ترث الخصائص والطرق من أصلها(parent).
نريد إضافة الوظيفة __init__() إلى الفئة الفرعية(child class) بدلاً من الكلمة الأساسية pass.
ملاحظة: يتم استدعاء الدالة __init__() تلقائياً في كل مرة يتم استخدام الفئة لإنشاء كائن جديد.
مثال
إضافة الدالة __init__() إلى فئة Student
class Student(Person):
tab def __init__(self, fname, lname):
tab tab #add properties etc.
عند إضافة الدالة__ init _ _ () ، إلى الفئة الفرعية(child class), لن ترث الفئة الفرعية الدالة __init _ _ () الخاصة بفئةْ الأصل أو الوالد(parent class).
ملاحظة:وظيفة الفئة الفرعية __init__() تتجاوز أو تُلغي وراثة الوظيفة __init__() في الفئة الأصل .
للاحتفاظ بوراثة الدالة __init__() مِن الفئة الأصل، أضف إلى دالة الفئة الفرعية استدعاء دالة __init__() لفئةْ الأصل:
مثال
class Person:
tab def __init__(self, fname, lname):
tab tab self.firstname = fname
tab tab self.lastname = lname
tab def printname(self):
tab tab print(self.firstname, self.lastname)
class Student(Person):
tab def __init__(self, fname, lname):
tab tab Person.__init__(self, fname, lname)
x = Student("Mike", "Olsen")
x.printname()
ستكون النتيجة:
Mike Olsen
جربها بنفسك مِن ملف inheritance_init.py
الآن لقد أضفنا بنجاح وظيفة __init__ () ، وحافظنا على وراثة الفئة الأصل ، ونحن على استعداد لإضافة وظائف أخرى في وظيفة __init__ ().
استخدام الوظيفة super ()
تحتوي لغة Python أيضًا على وظيفة super() تجعل الفئة الفرعية ترث جميع الوظائف والخصائص من الفئة الأصل:
مثال
class Person:
tab def __init__(self, fname, lname):
tab tab self.firstname = fname
tab tab self.lastname = lname
tab def printname(self):
tab tab print(self.firstname, self.lastname)
class Student(Person):
tab def __init__(self, fname, lname):
tab tab super().__init__(fname, lname)
x = Student("Mike", "Olsen")
x.printname()
ستكون النتيجة:
Mike Olsen
جربها بنفسك مِن ملف inheritance_super.py
باستخدام الدالة super() لا نحتاج إلى استخدام اسم العنصر الأصل، فإننا سنرث الأساليب والخصائص تلقائياً من الأصل.
إضافة خصائص إلى الفئة الفرعية
مثال
إضافة خاصية تسمى graduationyear إلى فئة Student
class Person:
tab def __init__(self, fname, lname):
tab tab self.firstname = fname
tab tab self.lastname = lname
tab def printname(self):
tab tab print(self.firstname, self.lastname)
class Student(Person):
tab def __init__(self, fname, lname):
tab tab super().__init__(fname, lname)
tab tab self.graduationyear = 2019
x = Student("Mike", "Olsen")
print(x.graduationyear)
ستكون النتيجة:
2019
جربها بنفسك مِن ملف inheritance_add_prop.py
في المثال أدناه ، العام 2019 يجب أن يكون متغيرًا ، ويتم تمريره إلى الفئة Student عند إنشاء عناصر مِن Student.
للقيام بذلك ، أضف معامِل آخر في دالة __init __ ():
مثال
إضافة معامِل year وتمرير السنة الصحيحة عند إنشاء الكائنات:
class Person:
tab def __init__(self, fname, lname):
tab tab self.firstname = fname
tab tab self.lastname = lname
tab def printname(self):
tab tab print(self.firstname, self.lastname)
class Student(Person):
tab def __init__(self, fname, lname, year):
tab tab super().__init__(fname, lname)
tab tab self.graduationyear = year
x = Student("Mike", "Olsen", 2019)
print(x.graduationyear)
ستكون النتيجة:
2019
جربها بنفسك مِن ملف inheritance_add_prop2.py
إضافة وظائف إلى الفئة الفرعية
مثال
إضافة وظيفة تسمى welcome إلى فئة Student
class Person:
tab def __init__(self, fname, lname):
tab tab self.firstname = fname
tab tab self.lastname = lname
tab def printname(self):
tab tab print(self.firstname, self.lastname)
class Student(Person):
tab def __init__(self, fname, lname, year):
tab tab super().__init__(fname, lname)
tab tab self.graduationyear = year
tab def welcome(self):
tab tab print("Welcome", self.firstname, self.lastname, "to the class of", self.graduationyear)
x = Student("Mike", "Olsen", 2019)
x.welcome()
ستكون النتيجة:
Welcome Mike Olsen to the class of 2019
جربها بنفسك مِن ملف inheritance_add_method.py
إذا قمتَ بإضافة وظيفة في الفئة الفرعية بنفس اسم الدالة في الفئة الأصل(parent class) ، فسيتم تجاوز وراثة الوظيفة الأصل.
يعني إذا أنشأنا في هذه الحالة, كائناً مِن الفئة الفرعية, فإنّ وظيفة الأصل لا تعود تعمل عليه, بَل فقط الوظيفة الجديدة في الفئة الفرعية.
الدرس مع الملفات المُرفقة:
https://www.dropbox.com/s/qww6gdzfz48hoja/26Python%20Inheritance.zip?dl=1
اقتبس من صوت الأقصى في 26 أبريل، 2021, 5:23 صجميل جدا جهد رااائع جزاكم الله خيرا، وعندي اقتراح صغير وهو جمع كل الدروس في ملف html أو مكان واحد حتى يسهل الحصول عليها.
ويمكنني المساعدة في ذلك.
جميل جدا جهد رااائع جزاكم الله خيرا، وعندي اقتراح صغير وهو جمع كل الدروس في ملف html أو مكان واحد حتى يسهل الحصول عليها.
ويمكنني المساعدة في ذلك.
اقتبس من ابراهيم حمادة في 26 أبريل، 2021, 11:58 متحياتي لك صوت الأقصى
و تحياتنا للأقصى و أهله الثائرون
نعم أنا معك, هو اقتراح جميل
لكن السلسلة حتى الآن لم تكتمل
و إنشاء الله عند اكتمال ترجمةْ كل الدروس, سأضعها في مُجلَّد و أضعها هنا
و عندها إذا أحببت أن تساعد و تحولها إلى ملف html, فسيكون شيء رائع بالفعل
و بتلك الصيغة سيكون تصفحها أسهل بالنسبة للمكفوفين بكل تأكيد
فجزاك الله خيرا مُسبقا.
تحياتي لك صوت الأقصى
و تحياتنا للأقصى و أهله الثائرون
نعم أنا معك, هو اقتراح جميل
لكن السلسلة حتى الآن لم تكتمل
و إنشاء الله عند اكتمال ترجمةْ كل الدروس, سأضعها في مُجلَّد و أضعها هنا
و عندها إذا أحببت أن تساعد و تحولها إلى ملف html, فسيكون شيء رائع بالفعل
و بتلك الصيغة سيكون تصفحها أسهل بالنسبة للمكفوفين بكل تأكيد
فجزاك الله خيرا مُسبقا.