ساخت ماژول در پایتون — آموزش ایجاد ماژول به زبان ساده

آخرین به‌روزرسانی: ۲۱ دی ۱۴۰۱
زمان مطالعه: ۱۰ دقیقه
ساخت ماژول در پایتون

برنامه‌نویسی ماژولار، رویکردی برای طراحی نرم‌افزار است که با استفاده از آن، می‌توان اجزای یک برنامه را به بخش‌های کوچک‌تر تقسیم کرد. به هر یک از این بخش‌های کوچک‌تر برنامه، ماژول گفته می‌شود. با استفاده از این رویکرد برنامه‌نویسی، می‌توان ماژول‌ها را به صورت جداگانه ایجاد کرد و آن‌ها را به طور مستقل مورد بررسی و آزمایش قرار داد. همچنین، از ماژول‌های ساخته شده می‌توان در سایر پروژه‌های برنامه‌نویسی استفاده کرد. زبان برنامه‌نویسی پایتون به عنوان یکی از زبان‌های برنامه‌نویسی شئ‌گرا، از برنامه‌نویسی ماژولار پشتیبانی می‌کند. در مقاله حاضر سعی شده است تا حد امکان به‌طور جامع به نحوه ساخت ماژول در پایتون پرداخته و شیوه‌های مختلف فراخوانی ماژول‌ها در پایتون به همراه مثال شرح داده شوند.

ماژول چیست ؟

برنامه‌های کامپیوتری می‌توانند از بخش‌های متعدد و جداگانه‌ای تشکیل شوند که به هر یک از این بخش‌ها، ماژول گفته می‌شود؛ به عبارتی، عملیات‌ مختلف یک برنامه کامپیوتری را می‌توان با استفاده از ماژول‌های جداگانه تعریف کرد.

با تخصیص دادن نام‌های منحصربفرد به کدهای ماژولار شده، می‌توان به دفعات از آن‌ها در برنامه استفاده کرد؛ به عبارت دیگر، زمانی که نیاز است از قطعه کدی چندین بار در برنامه فعلی خود یا در سایر پروژه‌های برنامه‌نویسی استفاده شود، تنها باید نام ماژول مورد نظر را در برنامه فراخوانی کرد. بدین ترتیب، با استفاده از این روش می‌توان از نوشتن کدهای تکراری در برنامه جلوگیری کرد.

ماژول در پایتون

برنامه‌نویسی ماژولار خوانایی و کارایی برنامه را افزایش می‌دهد و به تسریع نوشتن برنامه کامپیوتری و تست آن کمک می‌کند. به‌علاوه، چنین رویکردی در کدنویسی به برنامه‌نویس این امکان را می‌دهد که تنها بر بخش خاصی از برنامه تمرکز داشته باشد. در ادامه، به توضیح انواع ماژول و نحوه ساخت ماژول در پایتون پرداخته می‌شود.

انواع ماژول در پایتون کدامند ؟

زبان برنامه‌نویسی پایتون یکی از زبان‌های برنامه‌نویسی شئ‌گرا محسوب می‌شود که از رویکرد برنامه‌نویسی ماژولار پشتیبانی می‌کند؛ به عبارتی، می‌توان از کدهایی که به صورت مکرر در پروژه‌های مختلف برنامه‌نویسی به کار می‌روند، در قالب توابع مستقل یا متد کلاس استفاده کرد.

برای ساخت ماژول در پایتون، می‌توان از فایلی با پسوند py. استفاده کرد؛ به عبارتی، هر فایلی با پسوند py. در پایتون، ماژول تلقی می‌شود. ماژول‌های پایتون را می‌توان به دو دسته تقسیم‌بندی کرد:

  • «ماژول‌های توکار» (Built-in Modules): ماژول‌های توکار، ماژول‌های از پیش تعریف شده‌ای هستند که می‌توان از طریق «کتابخانه استاندارد پایتون» (Python Standard Library) به آن‌ها دسترسی داشت. با دستور pip  می‌توان ماژول‌های توکار را برروی سیستم نصب و در پروژه‌های مختلف برنامه‌نویسی از آن‌ها استفاده کرد. دستور pip مدیریت «بسته‌های» (Packages) پایتون را برعهده دارد و امکان نصب ماژول‌ها و بسته‌های موجود در کتابخانه پایتون را فراهم می‌کند.
  • «ماژول‌های تعریف شده توسط کاربر» (User-Defined Modules): برنامه‌نویسان می‌توانند توابع و کلاس‌های خود را در قالب ماژول با پسوند py. ذخیره و به دفعات از آن‌ها در پروژه‌های برنامه‌نویسی مختلف استفاده کنند.

در ادامه مطلب حاضر، به نحوه فراخوانی ماژول‌ها در پایتون به همراه مثال پرداخته می‌شود.

نحوه فراخوانی ماژول در پایتون چگونه است ؟

پایتون هزاران ماژول استاندارد دارد که می‌توان برخی از این ماژول‌های آماده را در پوشه Lib در محل نصب پایتون مشاهده کرد. نحوه فراخوانی ماژول‌های توکار، مشابه با شیوه فراخوانی ماژول‌های تعریف شده توسط کاربر هستند. به منظور فراخوانی ماژول‌ها در برنامه خود، از دستورات زیر استفاده می‌شود:

  • فراخوانی ماژول در پایتون با استفاده از دستور Import
  • فراخوانی ماژول در پایتون با استفاده از تغییر نام ماژول
  • فراخوانی ماژول در پایتون با استفاده از دستور From...Import
  • فراخوانی ماژول در پایتون با استفاده از دستور *

در ادامه، به توضیح هر یک از دستورات فوق برای فراخوانی ماژول‌های توکار پرداخته می‌شود و پس از آن، توضیحاتی درباره نحوه ساخت ماژول در پایتون و شیوه فراخوانی ماژول‌های ساخته شده توسط کاربر ارائه خواهد شد.

فراخواندن ماژول در پایتون با استفاده از دستور Import

به منظور فراخوانی ماژول‌های استاندارد در پایتون، از کلمه کلیدی import  استفاده می‌شود. بعد از نوشتن کلمه کلیدی import  باید نام فایل ماژول مربوطه را وارد کرد. نکته مهم این است که نباید بعد از کلمه کلیدی import  نام تابع درون ماژول نوشته شود. به عبارتی، کلمه کلیدی import  صرفاً برای فراخوانی نام ماژول استفاده می‌شود. در مثال زیر، ماژول math  ، به عنوان ماژول توکار در پایتون، فراخوانی شده است. پس از فراخوانی این ماژول، می‌توان از تابع pi  در این ماژول استفاده کرد.

# import statement example
# to import standard module math

import math
print("The value of pi is", math.pi)

با اجرای دستور فوق، خروجی به صورت زیر خواهد بود.

The value of pi is 3.141592653589793

فراخوانی ماژول در پایتون با استفاده از دستور As برای تغییر نام

با استفاده از کلمه کلیدی as  می‌توان به ماژول فراخوانی شده، نام مستعار داد. زمانی از نام مستعار برای ماژول‌ها استفاده می‌شود که نام ماژول طولانی باشد و نوشتن نام کامل ماژول در سراسر برنامه، زمان‌بر باشد. در مثال زیر، نام مستعار m  برای نام ماژول math  درنظر گرفته شده است.

# import module by renaming it

import math as m
print("The value of pi is", m.pi)

خاطرنشان می‌شود که با دادن اسم مستعار m  به ماژول فراخوانی شده، دیگر نمی‌توان از نام اصلی ماژول math  در برنامه استفاده کرد. به عبارتی، باید برای استفاده از ماژول، اسم مستعار جدید ماژول را به کار برد؛ در غیر این صورت، برنامه با خطای کامپایلر مواجه می‌شود.

Traceback (most recent call last):
  File "", line 4, in 
NameError: name 'math' is not defined
> 

صدا زدن ماژول در پایتون با استفاده از دستور From...Import

با استفاده از دستور From...Import می‌توان به جای فراخواندن کل ماژول، اسامی خاصی را از ماژول فراخواند. به عنوان مثال، ماژول math دارای توابع ریاضیاتی مختلفی است که یکی از این توابع، تابع pi نام دارد. با استفاده از روش فراخوانی From...Import می‌توان  فقط تابع pi  این ماژول را فراخوانی کرد. علاوه بر این، با استفاده از این روش فراخوانی ماژول، دیگر نیازی نیست برای استفاده از تابع ماژول، نام ماژول را نیز به صورت math.pi  به کار ببریم؛ تنها کافی است که نام تابع pi را مستقیماً در برنامه استفاده کنیم.

# import only pi from math module

from math import pi
print("The value of pi is", pi)

همچنین، می‌توان با استفاده از دستور From...Import نام چندین تابع و متغیر از یک ماژول را با استفاده از کاما فراخوانی کرد. در مثال زیر، با استفاده از دستور From...Import تابع pi و متغیر e  از ماژول math  به صورت همزمان فراخوانی شده‌اند.

>>> from math import pi, e

در خروجی نیز می‌توان مستقیماً به مقدار هر یک از توابع و متغیرها به صورت زیر دسترسی داشت.

>>> pi
3.141592653589793
>>> e
2.718281828459045

فراخوانی ماژول در پایتون با استفاده از دستور ستاره

با استفاده از دستور *  می‌توان تمامی اجزای ماژول را فراخوانی کرد. در مثال زیر، تمامی اسامی مربوط به اجزای ماژول math  فراخوانی شده‌اند.

# import all names from the standard module math

from math import *
print("The value of pi is", pi)

فراخوانی ماژول با استفاده از ستاره روش کارامدی در برنامه‌نویسی نیست زیرا این روش منجر به کاهش خوانایی برنامه خواهد شد. توصیه می‌شود از سایر شیوه‌های فراخوانی در کدنویسی استفاده شود.

معرفی فیلم های آموزش پایتون

فیلم های آموزش پایتون فرادرس

سایت فرادرس یک مجموعه آموزشی برای علاقه‌مندان به یادگیری زبان برنامه‌نویسی پایتون فراهم کرده است. امروزه، پایتون به عنوان یکی از زبان‌های برنامه‌نویسی شئ‌گرا، در اکثر حوزه‌های برنامه‌نویسی استفاده می‌شود. افراد علاقه‌مند به این زبان می‌توانند از مجموعه فیلم‌های آموزشی پایتون در سایت فرادرس استفاده کنند. این دوره‌های آموزشی شامل فیلم‌های آموزشی مقدماتی تا پیشرفته و پروژه‌محور زبان پایتون می‌شوند. در تصویر فوق تنها برخی از دوره‌های آموزشی مجموعه آموزش پایتون فرادرس نمایش داده شده‌اند.

نحوه ساخت ماژول در پایتون چگونه است ؟

نحوه ساخت ماژول در پایتون مشابه روش ایجاد سایر فایل‌های پایتون است. ماژول‌های پایتون می‌توانند شامل تعاریف توابع، کلاس‌ها و متغیرها باشند و با پسوند py. ذخیره شوند. در ادامه، به نحوه ایجاد ماژول در پایتون و نحوه فراخوانی آن‌ها پرداخته می‌شود.

ساخت ماژول در پایتون برای توابع

ماژول‌های تعریف شده در پایتون می‌توانند شامل توابع مختلف باشند. به منظور ساخت ماژولی که دارای یک تابع با عنوان world  است و مقداری را در خروجی چاپ می‌کند، می‌توان فایلی با عنوان hello.py ایجاد کرد و قطعه کد زیر را داخل آن نوشت.

# Define a function
def world():
    print("Hello, World!")

دستور بالا تابعی با عنوان world()  تعریف کرده که عبارت Hello, World!  را در خروجی چاپ می‌کند. چنانچه این قطعه کد با دستور python hello.py  در خط فرمان اجرا شود، چیزی در خروجی چاپ نمی‌شود زیرا باید نام این تابع را در جایی از برنامه فراخوانی کرد.

برای فراخوانی ماژول hello  در پایتون، در همان مسیری که فایل hello.py در آن ایجاد شد، می‌توان فایلی با عنوان main_program.py  ایجاد کرد. چون ماژول hello ، ماژول توکار پایتون نیست، برای فراخواندن آن باید فایل ماژول hello را در همان مسیر فایل main_program.py قرار داد.

به منظور فراخوانی ماژول hello و استفاده از تابع world() ، در فایل main_program.py کد زیر نوشته می‌شود.

# Import hello module
import hello

# Call function
hello.world()

همان طور که در قطعه کد بالا ملاحظه می‌شود، پس از فراخوانی ماژول hello با استفاده از دستور import  ، می‌توان از تابع world() با استفاده از علامت نقطه استفاده کرد.

با استفاده از دستور زیر در خط فرمان، می‌توان قطعه کد بالا را اجرا کرد.

$ python main_program.py

خروجی دستور فوق به صورت زیر است:

Hello, World!

چنانچه در مسیر پروژه، فولدی برای ماژول‌های ساخته شده در نظر گرفته شود، در هنگام فراخوانی ماژول مورد نظر، در ابتدا باید نام فولدری نوشته شود که ماژول در آن قرار دارد. به عنوان مثال، چنانچه ماژول hello در فولدی با عنوان my_modules  قرار بگیرد، هنگام فراخوانی ماژول با دستور import  باید نام فولدر ماژول نیز نوشته شود. لازم به ذکر است که در این روش از فراخوانی، تنها از دستور From...Import استفاده می‌شود.

# Import hello module
from my_modules.hello import world

# Call function
hello.world()

 ایجاد ماژول در پایتون برای متغیرها

می‌توان در ماژول‌ها متغیرهایی با مقادیر مشخص تعریف کرد و آن‌ها را در سایر پروژه‌های پایتون به کار برد. در ماژول hello که پیش از این تعریف شد، می‌توان به صورت زیر متغیری با عنوان shark  تعریف کرد و مقدار Sammy‌ را به آن تخصیص داد.

# Define a function
def world():
    print("Hello, World!")

# Define a variable
shark = "Sammy"

با استفاده از دستور import می‌توان ماژول hello را در برنامه فراخوانی کرد و با استفاده از نام ماژول به همراه نقطه و اسم متغیر، به مقدار متغیر Sammy دسترسی داشت.

# Import hello module
import hello

# Print variable
print(hello.shark)

با اجرا کردن دستور فوق، مقدار Sammy در خروجی به صورت زیر ملاحظه می‌شود.

Summy

نحوه نوشتن ماژول برای کلاس ها

ماژول‌ها می‌توانند شامل تعریف کلاس و اجزای کلاس نظیر مشخصه‌ها و متدها نیز باشند. در مثال زیر، کلاسی با عنوان Octopus  در ماژول hello تعریف شده است که دارای مشخصه‌هایی با عناوین name  و color  و متدی با عنوان tell_me_about_the_octopus  برای چاپ مقادیر مشخصه‌ها است.

# Define a class
class Octopus:
    def __init__(self, name, color):
        self.color = color
        self.name = name

    def tell_me_about_the_octopus(self):
        print("This octopus is " + self.color + ".")
        print(self.name + " is the octopus's name.")

به منظور استفاده از کلاس Octopus از ماژول hello ، در فایل main_program.py ، شئ‌ای از کلاس Octopus با عنوان jesse  ساخته شده است.

# Call class
jesse = hello.Octopus("Jesse", "orange")
jesse.tell_me_about_the_octopus()

همان طور که در قطعه کد بالا ملاحظه می‌شود، زمانی که با استفاده از دستور hello.Octopus()  کلاس Octopus صدا زده می‌شود، می‌توان به توابع درون کلاس و مشخصه‌های آن دسترسی داشت. بدین‌ ترتیب، می‌توان برای مشخصه‌های کلاس Octopus ، مقادیر Jesse و Orange را ارسال کرد. همچنین، با استفاده از نام شئ ساخته شده (jesse)، می‌توان به تابع درون ماژول دسترسی داشت.

در این حالت، دیگر نیاز به نوشتن نام ماژول نیست و با دستور jese.tell_me_about_the_octopus()  می‌توان تابع درون ماژول hello را صدا زد. همچنین، می‌توان بدون نوشتن نام ماژول، تنها با استفاده از نام شئ به مشخصه کلاس دسترسی داشت. در مثال فوق، می‌توان به مشخصه color  شئ jesse  ، با استفاده از دستور jesse.color  دسترسی داشت.

با اجرای قطعه کد فوق، خروجی برنامه به شکل زیر است:

This octopus is orange.
Jesse is the octopus's name.

شایان ذکر است که ماژول‌ها علاوه بر تعاریف (definitions)، می‌توانند شامل دستورات اجرایی نیز باشند. به عنوان مثال، می‌توان علاوه بر تعریف تابع و نوشتن بدنه آن در ماژول hello  ، نام تابع را نیز در این ماژول صدا زد. در مثال زیر، علاوه بر تعریف تابع world  و مشخص کردن بدنه آن، از دستور world()  برای صدا زدن تابع استفاده شده است.

# Define a function
def world():
    print("Hello, World!")

# Call function within module
world()

حال می‌توان در فایل main_program.py تنها نام ماژول hello را به صورت زیر فراخوانی کرد.

# Import hello module
import hello

با فراخوانی ماژول hello و اجرای کد قبل، خروجی برنامه به صورت زیر است.

Hello, World!

دسترسی به ماژول های پایتون

یکی از اهداف ساخت ماژول‌، استفاده از آن‌ها در پروژه‌های برنامه‌نویسی مختلف است. زمانی که ماژولی فراخوانی می‌شود، پایتون چندین مسیر را برای فراخوانی ماژول بررسی می‌کند. مفسر پایتون، در ابتدا بین ماژول‌های توکار خود به دنبال ماژول فراخوانی شده می‌گردد. اگر نام ماژول را در میان ماژول‌های توکار پیدا نکرد، نام آن را در لیست مسیرهای تعریف شده در sys.path  جستجو می‌کند. بدین‌ ترتیب، مفسر پایتون، سه مسیر را برای پیدا کردن نام ماژول فراخوانی شده جستجو می‌کند:

  • مسیر جاری که فایل پروژه پایتون در آن قرار دارد. در مثال قبل، مفسر پایتون مسیر فعلی فایل main_program.py را برای پیدا کردن نام ماژول hello  جستجو می‌کند.
  • PYTHONPATH (متغیر محیطی به همراه لیستی از مسیرهای مشخص شده)
  • مسیر پیش‌فرض نصب پایتون

منطقی نیست برای فراخوانی ماژول‌ نوشته شده در پروژه‌های مختلف، آن را در مسیرهای پروژه‌‌ها قرار دهیم. به عبارتی، برای استفاده از ماژول‌های پایتون که خارج از مسیر فایل‌های پروژه قرار دارند، بهتر است آن‌ها را به PYTHONPATH یا مسیر پیش‌فرض نصب پایتون اضافه کرد.

در ادامه مطلب، به توضیح مراحل اضافه کردن ماژول به PYTHONPATH و مسیر پیش‌فرض نصب پایتون پرداخته می‌شود.

ماژول در پایتون

اضافه کردن مسیر ماژول‌ها به لیست مسیرهای ماژول پایتون

یکی از روش‌های استفاده از ماژول‌های خارج از مسیر پروژه فعلی، فراخواندن ماژول به همراه مسیر قرار گرفتن آن برروی سیستم است.

به منظور ضمیمه کردن مسیر ماژول به فایل پایتون خود، باید در ابتدا ماژول sys  را فراخوانی کرد. ماژول sys ماژولی است که در کتابخانه استاندارد پایتون قرار دارد و شامل توابع و پارامترهای خاص سیستم می‌شود. با استفاده از این ماژول می‌توان مسیر ماژول‌های مختلف تعریف شده توسط کاربر را در برنامه پایتون مشخص کرد.

برای مثال، می‌توان فایل hello.py را به مسیر /usr/sammy/  منتقل کرد تا با فایل main_program.py هم‌مسیر نباشد. در این حالت، برای فراخوانی ماژول hello در فایل main_program.py ، باید از ماژول sys استفاده کرد. به عبارتی، با استفاده از ماژول sys می‌توان مسیر ماژول hello  را به لیست مسیرهای ماژول‌های پایتون اضافه کرد تا پایتون برای فراخوانی آن، به مسیر مشخص شده رجوع کند.

import sys
sys.path.append('/usr/sammy/')

import hello
...

اضافه کردن ماژول به مسیر نصب پایتون

روش دیگری که می‌توان از ماژول‌های ساخته شده توسط کاربر در سایر پروژه‌های پایتون استفاده کرد، اضافه کردن ماژول به مسیر نصب پایتون است تا مفسر پایتون، نام ماژول کاربر را همانند نام سایر ماژول‌ها و «بسته‌های» (Packages) موجود در آن مسیر جستجو کند. این روش دسترسی به ماژول، روشی دائمی است و به راحتی می‌توان از ماژول در «سطح محیط مجازی» (Virtual Environment-Level) یا در «سطح کل سیستم» (System-Level) استفاده کرد.

به منظور یافتن مسیرهایی که پایتون برای بررسی ماژول‌های خود استفاده می‌کند، در ابتدا باید در خط فرمان با استفاده از دستور زیر مفسر پایتون را اجرا کرد.

$ python3

سپس، می‌توان با فراخوانی ماژول sys  و استفاده از دستور sys.path  مسیر سیستم را ملاحظه کرد.

import sys

print(sys.path)

با اجرای قطعه کد فوق، حداقل آدرس یک مسیر، همانند مسیر زیر، در خروجی نمایش داده می‌شود:

'/usr/sammy/my_env/lib/python3.5/site-packages'

حال می‌توان فایل ماژول خود را (فایل hello.py) به مسیر فوق منتقل کرد. پس از انتقال ماژول به مسیر نصب پایتون، می‌توان نام ماژول را در هر پروژه پایتون به صورت زیر فراخوانی کرد.

import hello
...

با استفاده از این روش می‌توان از طریق پروژه‌های مختلف پایتون به ماژول دسترسی داشت. به عبارتی، صرف نظر از اینکه پروژه پایتون در کدام مسیر قرار دارد، می‌توان ماژول مدنظر خود را به راحتی فراخوانی کرد.

بارگذاری مجدد ماژول

هنگام اجرای کد پایتون، مفسر پایتون تنها یک بار ماژول را با دستور import  در برنامه بارگذاری می‌کند. برای مثال، می‌توان فایلی با عنوان my_module ایجاد کرد و قطعه کد زیر را در آن نوشت.

# This module shows the effect of
#  multiple imports and reload

print("This code got executed")

چنانچه به دفعات مختلف، ماژول my_module  در برنامه فراخوانی شود، دستورات داخل ماژول تنها یک بار اجرا می‌شوند. در ادامه نیز ملاحظه می‌شود که دستور print  فقط یک بار اجرا شده است.

>>> import my_module
This code got executed
>>> import my_module
>>> import my_module

اگر تغییراتی در ماژول فراخوانی شده ایجاد شود، می‌توان ماژول را در برنامه خود مجدداً بارگذاری کرد. یکی از روش‌های بارگذاری مجدد این است که مفسر پایتون را مجدداً اجرا کرد. این روش بارگذاری، روش کارآمدی نیست.

روش کارآمد دیگر برای بارگذاری مجدد ماژول، استفاده از تابع reload()  از ماژول imp  است. در قطعه کد زیر ملاحظه می‌شود که بعد از فراخوانی ماژول my_module  ، نام این ماژول با استفاده از تابع reload() مجدداً فراخوانی شده و دستور print دو بار اجرا می‌شود.

>>> import imp
>>> import my_module
This code got executed
>>> import my_module
>>> imp.reload(my_module)
This code got executed

جمع‌بندی

زبان پایتون به عنوان یکی از زبان‌های برنامه‌نویسی شئ‌گرا از برنامه‌نویسی ماژولار پشتیبانی می‌کند و دارای ماژول‌های آماده بسیاری است که می‌توان آن‌ها را به سادگی برروی سیستم نصب کرد. همچنین، می‌توان ماژول‌های جدیدی را در این زبان تعریف و به دفعات از آن‌ها در پروژه‌های مختلف استفاد کرد. هدف از مقاله حاضر با عنوان «ساخت ماژول در پایتون»، معرفی و توضیح انواع روش‌های فراخوانی ماژول‌های توکار در زبان برنامه‌نویسی پایتون بود. همچنین، در این مقاله به توضیح نحوه ساخت ماژول در پایتون پرداخته شد و شیوه‌های فراخوانی ماژول‌های تعریف شده توسط کاربر نیز شرح داده شدند.

بر اساس رای ۱۱ نفر
آیا این مطلب برای شما مفید بود؟
شما قبلا رای داده‌اید!
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
techvidvan programiz digitalocean makeuseof

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *