إعلان
دورة تطوير التطبيقات باستخدام لغة JavaScript في هذه الدورة ستتعلم لغة جافا سكريبت, استخدام مكتبة React.js, بناء API الموقع بواسطة Node.js, تطوير تطبيق جوال باستخدام React Native, و في نهاية الدورة ستتعلم تطوير تطبيق محادثة شبيه بتطبيق WhatsApp. تعلم الآن
دورة تطوير واجهات المستخدم في هذه الدورة ستتعلم لغة HTML و لغة CSS و لغة JavaScript. من ناحية التطبيق العملي ستتعلم طريقة بناء واجهة متجر إلكتروني مكون من ست صفحات, تحويل خمسة تصاميم PSD إلى صفحات ويب, بناء واجهة مستخدم تشبه موقع يوتيوب, بناء لوحة تحكم إحترافية. تعلم الآن
تطوير تطبيقات باستخدام لغة بايثون في هذه الدورة ستتعلم أساسيات البرمجة بلغة بايثون وصولاً إلى التعامل مع أشهر أطر العمل (Flask و Django) و ستتعلم كيف تبني متجر إلكتروني يمكن للمستخدمين البيع و الشراء من خلاله. تعلم الآن
دورة تطوير تطبيقات الويب باستخدام لغة PHP في هذه الدورة ستتعلم لغة PHP من الصفر, استخدام إطار العمل Laravel بشرح مفصّل و عملي, كيفية تطوير شبكة اجتماعية تشبه Instagram, بناء API لتطبيق جوال وفق أسلوب RESTful, تطوير موقع إعلانات مبوبة, تطوير نظام إدارة محتوى CMS كامل. تعلم الآن
دورة تطوير تطبيقات الويب باستخدام لغة Ruby في هذه الدورة ستتعلم البرمجة بلغة Ruby إنطلاقاً من أبسط المفاهيم وحتى بناء تطبيق حقيقي, إستخدام إطار العمل Ruby on Rails بشرح مفصّل و عملي, بناء تطبيق حقيقي عبارة عن شبكة اجتماعية تشبه تويتر, تطوير مجتمع الكتروني يشبه حسوب I/O. تعلم الآن
دورة علوم الحاسوب هذه الدورة معدة لتكون مدخل لعلوم الحاسوب و لغات البرمجة حيث ستتعرف فيها على أنظمة التشغيل و ستتعمق في نظام لينكس و في كيفية التعامل معه من خلال موجه الأوامر, بالإضافة إلى قواعد البيانات و أساسيات الشبكات و الخوادم و مبادئ الحماية والأمان في الويب. تعلم الآن

    بايثون تعدد الأشكال

    مفهوم تعدد الأشكال

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

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

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

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


    في المثال التالي قمنا بتعريف كائن إسمه string وضعنا فيه نص عادي, و كائن نوعه list إسمه aList وضعنا فيه 5 عناصر.
    بعدها قمنا بطباعة ما سترجعه الدالة len() في حال تمرير الكائن string و الكائن aList لها.

    مثال

    Test.py
    # يحتوي على نص string هنا قمنا بتعريف كائن إسمه
    string = 'Python tutorial for beginners'
    
    # وضعنا فيه مجموعة أعداد صحيحة aإسمه هنا قمنا بتعريف
    a= [10, 20, 30, 40, 50]
    
    # len() الذي سترجعه الدالة string هنا قمنا بعرض عدد أحرف الكائن
    print('Number of characters in string is:', len(string))
    
    # len() الذي سترجعه الدالة aهنا قمنا بعرض عدد عناصر الكائن
    print('Number of elements in ais:', len(aList))
    		

    سنحصل على النتيجة التالية عند تشغيل الملف Test.

    Number of characters in string is: 29
    Number of elements in ais: 5

    إذاً, نلاحظ أنه عند تمرير الكائن string للدالة len() قامت بإرجاع عدد أحرفه. و عند تمرير الكائن aList قامت بإرجاع عدد عناصره. مما يعني أن الدالة len() تقوم بالتشييك على نوع الكائن الذي يمرر لها و على أساس نوعه تقوم بإرجاع القيمة.



    معلومة تقنية

    في بايثون, يوجد دالة جاهزة إسمها isinstance() يمكن استخدامها لمعرفة ما إذا كان الكائن قد تم إنشاؤه من كلاس معين أم لا.
    في حال كان منشئاً منه فإنها ترجع True, أما إذا لم يكن منشئاً منه فإنها ترجع False.


    الآن, بما أن الدالة len() تقوم بالتشييك على نوع الكائن الذي نمرره لها فهذا يعني أنها على الأرجح معرفة كالتالي.

    def len(obj):
    	
    	# str هو obj هنا كأننا قلنا: هل نوع الكائن الذي تم تمرير مكان الكائن
    	if isinstance(obj, str):
    		# أي نص, سيتم تنفيذ الكود الخاص بحساب عدد أحرفه و من ثم إرجاعه str إذا كان نوع الكائن الذي تم تمريره للدالة هو
    		
    	# هو objهنا كأننا قلنا: هل نوع الكائن الذي تم تمرير مكان الكائن
    	elif isinstance(obj,):
    		# أي مصفوفة, سيتم تنفيذ الكود الخاص بحساب عدد عناصرها و من ثم إرجاعه إذا كان نوع الكائن الذي تم تمريره للدالة هو
    	

    بناء دالة تطبق مبدأ تعدد الأشكال

    في المثال التالي قمنا بتعريف دالة إسمها print_sum() مصممة للتعامل مع ثلاث أنواع من الكائنات.

    • إذا مررت لها عدد صحيح, أي نوعه int, فإنها تقوم بطباعة ناتج جمع الأرقام الموجودة فيه.
    • إذا مررت لها نص يمثل عدد صحيح, أي نوعه str, فإنها تقوم بتحويل الأحرف الموجودة فيه لأرقام و من ثم تقوم بطباعة ناتج جمع هذه الأرقام.
    • إذا مررت لها مصفوفة نوعها list تحتوي على أعداد صحيحة أو نصوص تمثل أعداد صحيحة, فإنها تقوم بطباعة ناتج جمع هذه العناصر.

    مثال

    Test.py
    # obj تحتوي على باراميتر إسمه print_sum هنا قمنا بتعريف دالة إسمها
    def print_sum(obj):
    
    	# سنستخدمه عند إجراء أي عملية جمع لذلك قمنا بتجهيزه و إعطاءه القيمة 0 s المتغير 
        s = 0
    
    	# أي إذا كانت قيمته عبارة عن عدد صحيح ,int إذا كان قيمته نوعها obj الكود التالي مهمته حساب ناتج جمع الأرقام الموجودة في الكائن
        if isinstance(obj, int):
            while obj:
                s += obj % 10
                obj //= 10
            print('Sum of digits:', s)
    
    	# أي إذا كانت قيمته عبارة عن نص يمثل عدد صحيح ,str إذا كان قيمته نوعها obj الكود التالي مهمته حساب ناتج جمع الأرقام الموجودة في الكائن
        elif isinstance(obj, str):
            for c in obj:
                s += int(c)
            print('Sum of characters:', s)
    
    	# أي إذا كانت قيمته عبارة عن مصفوفة ,إذا كان عبارة عن obj الكود التالي مهمته حساب ناتج جمع قيم العناصر الموجودة في الكائن
        elif isinstance(obj,):
            for e in obj:
                s += int(e)
            print('Sum of elements:', s)
    
    	# أو str أو int ليس obj الكود التالي مهتمه طباعة جملة تنبيه في حال كان نوع قيمة الكائن
    	else:
    		print('This function is not made for this type!')
    		
    
    print_sum(12345)              # و تمرير عدد صحيح لها print_sum() هنا قمنا باستدعاء الدالة
    print_sum('12345')            # و تمرير نص يمثل عدد صحيح لها print_sum() هنا قمنا باستدعاء الدالة
    print_sum([1, 2, 3, 4, 5])    # لها و تمرير مجموعة أعداد كـ print_sum() هنا قمنا باستدعاء الدالة
    print_sum((1, 2, 3, 4, 5))    # لها tuple و تمرير مجموعة أعداد كـ print_sum() هنا قمنا باستدعاء الدالة
    		

    سنحصل على النتيجة التالية عند تشغيل الملف Test.

    Sum of digits: 15
    Sum of characters: 15
    Sum of elements: 15
    This function is not made for this type!

    تطبيق مبدأ تعدد الأشكال مع الوراثة

    في المثال التالي قمنا بتعريف كلاس مجرّد إسمه BaseCountry يعتبر الكلاس الأساسي لأي كلاس يمثل بلد و بالتالي أي كلاس سننشئه ليمثل بلد ما يجب أن يرث منه. في هذا الكلاس قمنا بتجهيز 3 دوال مجرّدة أيضاً.
    بعدها قمنا بتعريف كلاس إسمه Egypt و كلاس إسمه Australia يرثان من الكلاس BaseCountry و يفعلان Override لكل الدوال التي ورثوها منه.
    بعدها قمنا بإنشاء دالة إسمها print_country_info() مهمتها إستدعاء جميع الدوال الموجودة في الكائن الذي نمرره لها بشرط أن يكون هذا الكائن قد تم إنشاؤه من كلاس يرث من الكلاس BaseCountry.

    في الأخير قمنا بإنشاء كائن من الكلاس Egypt و كائن من الكلاس Australia و تمرير كل كائن منهما للدالة print_country_info().

    مثال

    BaseCountry.py
    # يحتوي على 3 دوال فارغة BaseCountry هنا قمنا بإنشاء كلاس إسمه
    class BaseCountry:
    
        def name(self):
            pass
    
        def capital(self):
            pass
    
        def language(self):
            pass
    		

    Egypt.py
    # حتى نستطيع الوراثة منه BaseCountry الموجود في الموديول BaseCountry هنا قمنا بتضمين الكلاس
    from BaseCountry import BaseCountry
    
    
    # للدوال الثلاثة الموجودة فيه Override و يفعل BaseCountry يرث من الكلاس Egypt هنا قمنا بإنشاء كلاس فارغ إسمه
    class Egypt(BaseCountry):
    
        def name(self):
            print('Country: Egypt')
    
        def capital(self):
            print('Capital: Cairo')
    
        def language(self):
            print('Language: Arabic')
    		

    Australia.py
    # حتى نستطيع الوراثة منه BaseCountry الموجود في الموديول BaseCountry هنا قمنا بتضمين الكلاس
    from BaseCountry import BaseCountry
    
    
    # للدوال الثلاثة الموجودة فيه Override و يفعل BaseCountry يرث من الكلاس Australia هنا قمنا بإنشاء كلاس فارغ إسمه
    class Australia(BaseCountry):
    
        def name(self):
            print('Country: Australia')
    
        def capital(self):
            print('Capital: Canberra')
    
        def language(self):
            print('Language: English')
    		

    Test.py
    # حتى نستطيع التعامل معهم Australia و Egypt ,BaseCountry هنا قمنا بتضمين الكلاسات
    from BaseCountry import BaseCountry
    from Egypt import Egypt
    from Australia import Australia
    
    
    # obj عند استدعاء هذه الدالة, إذا كان الكائن الذي تم تمريره مكان الباراميتر .obj فيها باراميتر واحد إسمه print_country_info هنا قمنا بتعريف دالة إسمها
    # else سيتم إستدعاء الدوال الثلاثة الموجودة فيه. و إن لم يكن كذلك سيتم تنفيذ أمر الطباعة الموضوع في الجملة BaseCountry أصله كائن من كلاس يرث من الكلاس
    def print_country_info(obj):
        if isinstance(obj, BaseCountry):
            obj.name()
            obj.capital()
            obj.language()
        else:
            print('You should pass an object of type BaseCountry')
        print('----------------------------------------------')
    
    
    # australia إسمه Australia و كائن من الكلاس egypt إسمه Egypt هنا قمنا بإنشاء كائن من الكلاس
    egypt = Egypt()
    australia = Australia()
    
    # لكي يتم إستدعاء الدوال الثلاثة منهم australia و egypt و مررنا لها الكائنين print_country_info() هنا قمنا باستدعاء الدالة
    print_country_info(egypt)
    print_country_info(australia)
    
    # else و تمرير نص عادي لها. لاحظ كيف أنها ستقوم بتنفيذ أمر الطباعة الموضوع في الجملة print_country_info() هنا قمنا باستدعاء الدالة
    print_country_info('A string object')
    		

    سنحصل على النتيجة التالية عند تشغيل الملف Test.

    Country: Egypt
    Capital: Cairo
    Language: Arabic
    ----------------------------------------------
    Country: Australia
    Capital: Canberra
    Language: English
    ----------------------------------------------
    You should pass an object of type BaseCountry
    ----------------------------------------------

    تطبيق مبدأ تعدد الأشكال مع المصفوفات و مع الوراثة

    في المثال التالي قمنا بتعريف كلاس مجرّد إسمه BaseCountry يعتبر الكلاس الأساسي لأي كلاس يمثل بلد و بالتالي أي كلاس سننشئه ليمثل بلد ما يجب أن يرث منه. في هذا الكلاس قمنا بتجهيز 3 دوال مجرّدة أيضاً.
    بعدها قمنا بتعريف كلاس إسمه Egypt و كلاس إسمه Australia يرثان من الكلاس BaseCountry و يفعلان Override لكل الدوال التي ورثوها منه.

    في الأخير قمنا بإنشاء كائن من الكلاس Egypt و كائن من الكلاس Australia و من ثم وضعناهما في list إسمه countries.
    و بعدها قمنا بإنشاء حلقة تمر على جميع الكائنات الموضوعة في الكائن و تستدعي الدوال الثلالثة من كل كائن تم إنشاؤه من كلاس يرث من الكلاس BaseCountry.

    مثال

    BaseCountry.py
    # يحتوي على 3 دوال فارغة BaseCountry هنا قمنا بإنشاء كلاس إسمه
    class BaseCountry:
    
        def name(self):
            pass
    
        def capital(self):
            pass
    
        def language(self):
            pass
    		

    Egypt.py
    # حتى نستطيع الوراثة منه BaseCountry الموجود في الموديول BaseCountry هنا قمنا بتضمين الكلاس
    from BaseCountry import BaseCountry
    
    
    # للدوال الثلاثة الموجودة فيه Override و يفعل BaseCountry يرث من الكلاس Egypt هنا قمنا بإنشاء كلاس فارغ إسمه
    class Egypt(BaseCountry):
    
        def name(self):
            print('Country: Egypt')
    
        def capital(self):
            print('Capital: Cairo')
    
        def language(self):
            print('Language: Arabic')
    		

    Australia.py
    # حتى نستطيع الوراثة منه BaseCountry الموجود في الموديول BaseCountry هنا قمنا بتضمين الكلاس
    from BaseCountry import BaseCountry
    
    
    # للدوال الثلاثة الموجودة فيه Override و يفعل BaseCountry يرث من الكلاس Australia هنا قمنا بإنشاء كلاس فارغ إسمه
    class Australia(BaseCountry):
    
        def name(self):
            print('Country: Australia')
    
        def capital(self):
            print('Capital: Canberra')
    
        def language(self):
            print('Language: English')
    		

    Test.py
    # حتى نستطيع التعامل معهم Australia و Egypt ,BaseCountry هنا قمنا بتضمين الكلاسات
    from BaseCountry import BaseCountry
    from Egypt import Egypt
    from Australia import Australia
    
    
    # australia إسمه Australia و كائن من الكلاس egypt إسمه Egypt هنا قمنا بإنشاء كائن من الكلاس
    egypt = Egypt()
    australia = Australia()
    
    # countries قمنا بتسميته في australia و egypt هنا قمنا بوضع الكائنين
    countries = [egypt, australia]
    
    # country و في كل مرة تخزن كائن واحد في الكائن countries هنا قمنا بإنشاء حلقة تمر على كل عنصر ( أي كائن ) في الكائن
    # سيتم إستدعاء الدوال الثلاثة الموجودة فيه BaseCountry أصله كائن من كلاس يرث من الكلاس country إذا كان
    for country in countries:
        if isinstance(country, BaseCountry):
            country.name()
            country.capital()
            country.language()
            print('------------------')
    		

    سنحصل على النتيجة التالية عند تشغيل الملف Test.

    Country: Egypt
    Capital: Cairo
    Language: Arabic
    ------------------
    Country: Australia
    Capital: Canberra
    Language: English
    ------------------
    إعلان

    Eqla3Tech.com

    شروحات مكتوبة حول لغات البرمجة و تقنية المعلومات باللغة العربية مقدمة من إقلاع تك.

    لغة جافا لغة ++C قواعد البيانات نظام ويندوز نظام لينكس الشبكات تقنية المعلومات الأمن السيبراني

    الدورات

    أدوات مساعدة

    الأقسام

    دورات
    مقالات أسئلة مشاريع كتب