Programming Basics SQL HTML CSS JavaScript React Python C++ Java JavaFX Swing Problem Solving English English Conversations Computer Fundamentals Linux Learn Typing

بايثونالتعامل مع الموديول

  • مفهوم الموديول
  • طريقة إنشاء موديول
  • تحديد الموديول الأساسي في المشروع
  • تضمين كل محتوى الموديول في موديول آخر
  • تضمين الأشياء التي نحتاجها فقط من الموديول
  • تضمين كل محتوى الموديول و استدعاءه بإسمه فقط
  • إعادة تسمية الموديول عند تضمينها
  • تضمين موديول جاهز
  • إستخراج أسماء جميع الأشياء الموجودة في الموديول

مفهوم الموديول

الموديول ( Module ) عبارة عن ملف بايثون عادي إمتداده .py و يمكن أن يحتوي على متغيرات، دوال و كلاسات.

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

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

طريقة إنشاء موديول

لإنشاء موديول جديد في أي مشروع إتبع الخطوات التالية:

1. أنقر بزر الماوس الأيمن على إسم المشروع الذي ستنشئ فيه الموديول.
2. مرر الماوس فوق كلمة New.
3. أنقر على Python File.

إنشاء موديول جديد


4. قم بإعطاء الملف أي إسم مثل MyModule.
5. أنقر OK حتى يتم إنشاء ملف بايثون بهذا الإسم في المشروع.

تحديد إسم الموديول


الآن، لاحظ أنه تم إنشاء موديول جديد بداخل نفس المشروع إسمه MyModule.py.

رؤية الموديول الذي تم إنشاؤه

تحديد الموديول الأساسي في المشروع

المشروع الذي نتعامل معه أصبح يحتوي على ملفين هما Test.py و MyModule.py.

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


طريقة معرفة الموديول الذي سيتنفذ عند النقر على زر التشغيل

بكل بساطة، إسم الموديول الذي سيتنفذ عند النقر على زر التشغيل يظهر بجانبه. فمثلاً، نلاحظ أنه لا يزال الموديول Test هو الموديول الذي سيتنفذ عند النقر على زر التشغيل و السبب بذلك أننا لم نقم بتغييره.

الموديول الذي سيتنفذ عند التشغيل


طريقة تحديد الموديول الذي سيتنفذ في المشروع

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

تحديد الموديول الذي سيتنفذ عند التشغيل


في كل الأمثلة الموضوعة في هذا الدرس سنقوم دائماً بتنفيذ الأوامر الموجودة في الموديول Test.
كما أننا سنقوم بتضمين محتوى الموديول MyModule في الموديول Test.

تضمين كل محتوى الموديول في موديول آخر

في البداية، نستخدم الكلمة المحجوزة import لتضمين محتوى الموديول في موديول آخر.

إذا فعلت import لنفس الموديول أكثر من مرة، فإن مفسّر لغة بايثون لا يفعل import من جديد.


في المثال التالي قمنا بتعريف موديول إسمه MyModule يحتوي على دالة واحدة، و موديول آخر إسمه Test.
بعدها قمنا بتضمين كل محتوى الموديول MyModule في الموديول Test.

مثال

MyModule.py
def greeting():
    print('Welcome to harmash.com')
Test.py
# MyModule هنا قمنا بتضمين كل محتوى الموديول
import MyModule

# MyModule الموجودة في الموديول greeting() هنا قمنا باستدعاء الدالة
MyModule.greeting()

نتيجة تشغيل الموديول Test.

Welcome to harmash.com

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

تضمين الأشياء التي نحتاجها فقط من الموديول

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

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


في المثال التالي قمنا بتعريف موديول إسمه MyModule يحتوي على دالتين و كائن نوعه dict.
ثم قمنا بتعريف موديول آخر إسمه Test و فيه قمنا بتضمين الأشياء التي نحتاجها فقط من الموديول MyModule.

مثال

MyModule.py
# يتألف من 3 عناصر data إسمه dict هنا قمنا بتعريف
data = {
    'id': 5,
    'name': 'Sara',
    'gender': 'female'
}


# هنا قمنا بتعريف دالة نمرر لها إسم عند إستدعائها فتقوم بطباعة رسالة ترحيب لهذا الإسم
def login_msg(name):
    print("Welcome", name)


# هنا قمنا بتعريف دالة نمرر لها إسم عند إستدعائها فتقوم بطباعة رسالة وداع لهذا الإسم
def logout_msg(name):
    print('Good by', name)
Test.py
# MyModule فقط من الموديول login_msg() و الدالة data هنا قمنا بتضمين الكائن
from MyModule import data, login_msg

# name في المتغير data الموجودة في العنصر name هنا قمنا بتخزين قيمة المفتاح
name = data['name']

# name و تمرير الإسم الذي نريدها أن تطبعه و الذي في الأساس قمنا بتخزينه في المتغير login_msg() هنا قمنا باستدعاء الدالة
login_msg(name)

نتيجة تشغيل الموديول Test.

Welcome Sara

تضمين كل محتوى الموديول و استدعاءه بإسمه فقط

في حال أردت تضمين كل محتوى الموديول في موديول آخر مع عدم الإضطرار لذكر إسم الموديول كلما أردت إستخدام أشياء موجودة فيه فيمكنك وضع الكلمة المفتاحية from و يليها إسم الموديول، ثم الكلمة المفتاحية import و يليها الرمز * فقط.

في المثال التالي قمنا بتعريف موديول إسمه MyModule يحتوي على دالتين و كائن نوعه dict.
ثم قمنا بتعريف موديول آخر إسمه Test و فيه قمنا بتضمين كل الأشياء الموجودة في الموديول MyModule.

مثال

MyModule.py
# يتألف من 3 عناصر data إسمه dict هنا قمنا بتعريف
data = {
    'id': 5,
    'name': 'Sara',
    'gender': 'female'
}


# هنا قمنا بتعريف دالة نمرر لها إسم عند إستدعائها فتقوم بطباعة رسالة ترحيب لهذا الإسم
def login_msg(name):
    print("Welcome", name)


# هنا قمنا بتعريف دالة نمرر لها إسم عند إستدعائها فتقوم بطباعة رسالة وداع لهذا الإسم
def logout_msg(name):
    print('Good by', name)
Test.py
# MyModule هنا قمنا بتضمين كل شيء موجود في
from MyModule import *

# name في المتغير data الموجودة في العنصر name هنا قمنا بتخزين قيمة المفتاح
name = data['name']

# name و تمرير الإسم الذي نريدها أن تطبعه و الذي في الأساس قمنا بتخزينه في المتغير login_msg() هنا قمنا باستدعاء الدالة
login_msg(name)

نتيجة تشغيل الموديول Test.

Welcome Sara

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

إعادة تسمية الموديول عند تضمينها

بواسطة الكلمة المفتاحية as يمكن إعطاء إسم بديل ( Alias ) للموديول أثناء تضمينه لمناداته به بدلاً من مناداته بإسمه الأصلي.

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


في المثال التالي قمنا بتعريف موديول إسمه MyModule يحتوي على دالة واحدة, و موديول آخر إسمه Test.
بعدها قمنا بتضمين كل محتوى الموديول MyModule في الموديول MyModule مع إعطاء الموديول إسم مختصر.

مثال

MyModule.py
def greeting():
    print('Welcome to harmash.com')
Test.py
# كإختصار لإسم الموديول  'mod'  مع وضع الكلمة MyModule هنا قمنا بتضمين كل محتوى الموديول
import MyModule as mod

# mod الموجودة في الموديول الذي أسميناه greeting() هنا قمنا باستدعاء الدالة
mod.greeting()

نتيجة تشغيل الموديول Test.

Welcome to harmash.com

تضمين موديول جاهز

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

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

مثال

Test.py
# platform هنا قمنا بتضمين كل محتوى الموديول
import platform

# هنا قمنا بعرض إسم نظام التشغيل
print('Operating System:', platform.system())

# هنا قمنا بعرض كل المعلومات المتوفرة عن المعالج
print('Processor:', platform.processor())

# هنا قمنا بعرض إصدار بايثون المنصب على الجهاز
print('Python Version:', platform.python_version())

النتيجة ستكون مختلفة عن النتيجة التالي على حسب مواصفات حاسوبك.

Operating System: Windows
Processor: Intel64 Family 6 Model 142 Stepping 9, GenuineIntel
Python Version: 3.6.4

إستخراج أسماء جميع الأشياء الموجودة في الموديول

لمعرفة إسم جميع الأشياء الموجودة في أي موديول، يمكنك تمرير إسم الموديول كقيمة للدالة dir() و من ثم طباعة ما سترجعه.

في المثال التالي قمنا بطباعة أسماء جميع الأشياء الموجودة في الموديول math.

مثال

Test.py
# math هنا قمنا بتضمين كل محتوى الموديول
import math

# dir() و التي سترجعها الدالة math هنا قمنا بعرض أسماء جميع الأشياء الموجودة في الموديول
print(dir(math))

النتيجة

['__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc']