برنامهنویسی ماژولار، رویکردی برای طراحی نرمافزار است که با استفاده از آن، میتوان اجزای یک برنامه را به بخشهای کوچکتر تقسیم کرد. به هر یک از این بخشهای کوچکتر برنامه، ماژول گفته میشود. با استفاده از این رویکرد برنامهنویسی، میتوان ماژولها را به صورت جداگانه ایجاد کرد و آنها را به طور مستقل مورد بررسی و آزمایش قرار داد. همچنین، از ماژولهای ساخته شده میتوان در سایر پروژههای برنامهنویسی استفاده کرد. زبان برنامهنویسی پایتون به عنوان یکی از زبانهای برنامهنویسی شئگرا، از برنامهنویسی ماژولار پشتیبانی میکند. در مقاله حاضر سعی شده است تا حد امکان بهطور جامع به نحوه ساخت ماژول در پایتون پرداخته و شیوههای مختلف فراخوانی ماژولها در پایتون به همراه مثال شرح داده شوند.
ماژول چیست ؟
برنامههای کامپیوتری میتوانند از بخشهای متعدد و جداگانهای تشکیل شوند که به هر یک از این بخشها، ماژول گفته میشود؛ به عبارتی، عملیات مختلف یک برنامه کامپیوتری را میتوان با استفاده از ماژولهای جداگانه تعریف کرد.
با تخصیص دادن نامهای منحصربفرد به کدهای ماژولار شده، میتوان به دفعات از آنها در برنامه استفاده کرد؛ به عبارت دیگر، زمانی که نیاز است از قطعه کدی چندین بار در برنامه فعلی خود یا در سایر پروژههای برنامهنویسی استفاده شود، تنها باید نام ماژول مورد نظر را در برنامه فراخوانی کرد. بدین ترتیب، با استفاده از این روش میتوان از نوشتن کدهای تکراری در برنامه جلوگیری کرد.
برنامهنویسی ماژولار خوانایی و کارایی برنامه را افزایش میدهد و به تسریع نوشتن برنامه کامپیوتری و تست آن کمک میکند. بهعلاوه، چنین رویکردی در کدنویسی به برنامهنویس این امکان را میدهد که تنها بر بخش خاصی از برنامه تمرکز داشته باشد. در ادامه، به توضیح انواع ماژول و نحوه ساخت ماژول در پایتون پرداخته میشود.
انواع ماژول در پایتون کدامند ؟
زبان برنامهنویسی پایتون یکی از زبانهای برنامهنویسی شئگرا محسوب میشود که از رویکرد برنامهنویسی ماژولار پشتیبانی میکند؛ به عبارتی، میتوان از کدهایی که به صورت مکرر در پروژههای مختلف برنامهنویسی به کار میروند، در قالب توابع مستقل یا متد کلاس استفاده کرد.
برای ساخت ماژول در پایتون، میتوان از فایلی با پسوند 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
جمعبندی
زبان پایتون به عنوان یکی از زبانهای برنامهنویسی شئگرا از برنامهنویسی ماژولار پشتیبانی میکند و دارای ماژولهای آماده بسیاری است که میتوان آنها را به سادگی برروی سیستم نصب کرد. همچنین، میتوان ماژولهای جدیدی را در این زبان تعریف و به دفعات از آنها در پروژههای مختلف استفاد کرد. هدف از مقاله حاضر با عنوان «ساخت ماژول در پایتون»، معرفی و توضیح انواع روشهای فراخوانی ماژولهای توکار در زبان برنامهنویسی پایتون بود. همچنین، در این مقاله به توضیح نحوه ساخت ماژول در پایتون پرداخته شد و شیوههای فراخوانی ماژولهای تعریف شده توسط کاربر نیز شرح داده شدند.