پیش از این در مطلب «برنامه‌نویسی شیئگرا در پایتون — یک راهنمای مقدماتی برای مبتدیان» به مفاهیم اساسی شیئ‌گرایی در پایتون پرداخته شد. در این مطلب، مفهوم شیئ و کلاس در پایتون و روش ساخت کلاس و استفاده از آن در پایتون به طور کامل و همراه با ارائه مثال‌های متعدد و متنوع آموزش داده خواهد شد.

شیئ و کلاس در پایتون

«زبان برنامه‌نویسی پایتون» (Python Programming Language)، یک «زبان برنامه‌نویسی شیئ‌گرا» (Object Oriented Programming Language | OOP) است. برخلاف «زبان‌های برنامه‌نویسی رویه‌ای» (Procedure Oriented Programming) که در آن‌ها تاکید اصلی روی توابع است، در زبان‌های برنامه‌نویسی شیئ‌گرا تمرکز بر «شیئ» (Objects) است. شیئ، یک مجموعه از داده‌ها (متغیرها) و متدها (توابع) است که روی داده‌ها کار می‌کند و کلاس، یک پیش‌طرح (Blueprint) برای شیئ محسوب می‌شود.

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

تعریف یک کلاس در پایتون

در این بخش از مطلب شیئ و کلاس در پایتون مفهوم کلاس بیان شده است. همانطور که تعریف توابع با کلیدواژه def شروع می‌شود، در پایتون، یک کلاس نیز با کلیدواژه class ساخته می‌شود. اولین رشته docstring نام دارد و دارای توصیفی کوتاه درباره کلاس است. اگرچه وجود داک‌استرینگ الزامی نیست، اما توصیه می‌شود. در اینجا، یک تعریف کوتاه از کلاس ارائه شده است.

class MyNewClass:
'''This is a docstring. I have created a new class'''
pass

یک کلاس، یک «فضای نام محلی» (Local Namespace) جدید می‌سازد که در آن، همه خصیصه‌ها تعریف شده‌اند. خصیصه‌ها می‌توانند داده یا تابع باشند. همچنین، خصیصه‌های خاصی در آن وجود دارند که با دو زیر خط (ــ) شروع می‌شوند. برای مثال، __doc__ یک داک‌استرینگ از آن کلاس را به کاربر می‌دهد. هم‌زمان با آنکه یک کلاس تعریف می‌شود، یک شیئ کلاس جدید با نام مشابه ساخته می‌شود. این شیئ کلاس امکان دسترسی به خصیصه‌های متفاوت را همچون نمونه‌سازی اشیای جدید از آن کلاس، فراهم می‌کند.

هنگامی که برنامه اجرا می‌شود، خروجی به صورت زیر خواهد بود:

10
<function 0x7feaa932eae8="" at="" myclass.func="">
This is my second class

ساخت یک شیئ در پایتون

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

این امر موجب می‌شود که یک شیئ نمونه جدید با نام ob ساخته شود. می‌توان به خصیصه‌های گوناگون یک شیئ با استفاده از پیشوند نام شیئ دسترسی داشت. خصیصه‌ها ممکن است داده یا متد باشند. متد یک شیئ، توابع متناظری از آن کلاس هستند. هر شیئ تابع که یک کلاس خصیصه است، متدی را برای اشیای آن کلاس تعریف می‌کند. این بدین معنا است که، نظر به آنکه MyClass.func یک شیئ تابع (خصیصه کلاس) است، ob.func شیئ متد است.

برخی پس از مطالعه کد بالا ممکن است متوجه پارامتر self در تعریف تابع درون کلاس شده باشند، اما متد، به سادگی به عنوان ()ob.func بدون هیچ آرگومانی فراخوانی شده است و کار هم می‌کند. این امر بدین دلیل است که هنگامی که یک شیئ متدهای آن را فراخوانی کند، خود تابع به عنوان اولین آرگومان پاس داده می‌شود. بنابراین، ()ob.func به (MyClass.func(ob ترجمه می‌شوند.

به طور کلی، فراخوانی یک متد با یک لیست از n آرگومان، مساوی با فراخوانی تابع متناظر با یک لیست آرگومان است که با قرار دادن شیئ متدها پیش از اولین آرگومان ساخته می‌شود. به همین دلیل، اولین آرگومان از تابع در کلاس باید خود شیئ باشد. این مورد به طور متداول self نامیده می‌شود. می‌توان آن را نام‌گذاری نیز کرد، ولی به شدت توصیه می‌شود که از قرارداد پیروی شود. با خواندن این مطلب، مخاطب باید با شیئ کلاس، شیئ نمونه، شیئ تابع، شیئ متد و تفاوت آن‌ها آشنا شده باشد.

سازنده‌ها در پایتون

توابع کلاس در پایتون که با دو خط زیر (ــ) آغاز می‌شوند، توابع ویژه نامیده می‌شوند، زیرا دارای معنای خاصی هستند. یکی از موارد مشخص جذاب، تابع ()__init__ است. این تابع زمانی فراخوانی می‌شود که یک شیئ جدید از آن کلاس نمونه‌سازی شود. این نوع تابع در برنامه‌نویسی شیئ‌گرا، سازنده نیز نامیده می‌شود. به طور معمول، از سازنده برای مقداردهی اولیه به همه متغیرها استفاده می‌شود.

در مثال بالا، یک کلاس جدید برای ارائه اعداد پیچیده تعریف می‌شود. این کلاس، دارای دو تابع است: ()__init__ برای مقداردهی اولیه به متغیرها (به طور پیش‌فرض صفر هستند) و ()getData برای نمایش عدد به شیوه مناسب. یک نکته جالب پیرامون گام بالا که باید متذکر شد، آن است که خصیصه‌های یک شیئ روی fly قابل ساختن هستند. یک خصیصه جدید attr برای شیئ c2 ساخته و خوانده شد. اما این کار، آن خصیصه را برای شیئ c1 نساخت.

حذف خصیصه‌ها و شیئ‌ها

در بخش پایانی از مطلب شیئ و کلاس در پایتون روش حذف خصیصه‌ها و اشیا بیان شده است. هر خصیصه‌ای از یک شیئ را می‌توان در هر زمان با استفاده از عبارت del حذف کرد. برای درک بهتر موضوع، کد زیر را باید در شل پایتون اجرا کرد و خروجی را دید.

حتی می‌توان خود شیئ را با استفاده از عبارت del حذف کرد.

>>> c1 = ComplexNumber(1,3)
>>> del c1
>>> c1
Traceback (most recent call last):
...
NameError: name 'c1' is not defined

در واقع، موضوع از این‌ها پیچیده‌تر است. هنگامی که (c1 = ComplexNumber(1,3 انجام می‌شود، یک نمونه شیئ جدید در حافظه ساخته می‌شود و نام c1 به آن متصل می‌شود. در دستور del c1، این اتصال حذف می‌شود و نام c1 از فضای نام متناظر حذف می‌شود. در صورتی که هیچ نام دیگری به شیئ اتصال پیدا نکند، همچنان در حافظه باقی می‌ماند و پس از مدتی تخریب می‌شود. این تخریب خودکار از اشیای بدون ارجاع در پایتون، بازیافت حافظه نامیده می‌شود.

اگر این مطلب برای شما مفید بوده است، آموزش‌ها و مطالب زیر نیز به شما پیشنهاد می‌شوند:

الهام حصارکی (+)

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

آیا این مطلب برای شما مفید بود؟

نظر شما چیست؟

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