برنامه‌نویسی شی‌گرا در پایتون

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

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

در این مقاله با نحوه کدنویسی شی‌گرایی در پایتون آشنا می‌شویم.

برنامه‌نویسی پایتون

دانش و فناوری بامداد ارائه می‌کند: بوتکمپ برنامه‌نویسی پایتون (مقدماتی تا پیشرفته)

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

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

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

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

اگر هنوز محیط مجازی را آماده نکرده‌اید، ابتدا باید یک محیط مجازی بسازید و PIP پایتون را نصب کنید. درست است که اکثر نسخه‌های جدید به همراه پایتون عرضه می‌شود، اما بعد از نصب این موارد، می‌توانیم کار خود را آغاز کنیم.

مفاهیم پایه پایتون: کلاس‌ها

class اصلی‌ترین مولفه دنیای برنامه‌نویسی شی‌گرایی است. کلاس مانند یک نقشه یا طرح اولیه است که خصوصیات یک شیء را تعریف می‌کند. به‌طور مثال، کلاس یک خودرو را درنظر بگیرید. کلاس خودرو وسیله‌ای با چهار چرخ، دست‌کم یک صندلی و یک موتور را تشریح خواهد کرد. روش ساخت کلاس در پایتون به شرح زیر است:

class Vehicle:
“”” This class defines vehicles. “””
pass

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

کلمه کلیدی pass به پایتون اعلام می‌دارد کاری انجام ندهد. Pass یک کلمه ویژه است و می‌توانید آن‌را شبیه یک دستور تصور کنید. این کلمه کلیدی باعث می‌شود که کد اجرا شود، ولی کاری انجام ندهد.

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

red_car = Vehicle()

اگر قطعه کد فوق را دومرتبه اجرا کنید مشاهه می‌کنید، که اتفاقی نمی‌افتد. این کد به درستی کار می‌کند، اما قرار نیست کار خاصی انجام دهد. کلاس Vehicle طرح اولیه یک وسیله نقلیه را تعریف کرده، در خط آخر یک شیء از آن ایجاد شده و نام آن red_car  قرار گرفته است.

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

red_car = Vehicle()
green_car = Vehicle()
blue_car = Vehicle()

اکنون برای آن‌که قطعه کد ما شکل ملموس‌تری پیدا کند، چند قطعه کد به آن اضافه می‌کنیم. علاوه بر این به کلاس Vehicle متدی به نام –int– به شرح زیر اضافه می‌کنیم:

class Vehicle:
“”” This class defines vehicles. “””
def __init__(self, color=’plain’):
“”” Setup some custom car properties “””
print(‘New car made!’)
self.color = color
red_car = Vehicle()
green_car = Vehicle()
blue_car = Vehicle()

نکته مهمی که در قطعه کد بالا باید با آن دقت کنید متد –init– است. این متد باید با دو کاراکتر زیرخط آغاز شده و پایان پذیرد، زیرا یک متد خاص پایتون است. این متد هر زمان که شی‌ء جدیدی ایجاد می‌کنید به‌طور خودکار فراخوانی می‌شود. اکنون اگر قطعه کد فوق را اجرا کنید عبارت !New car made سه بار نشان داده می‌شود.

متد –init— یک کاراکتر (ورودی) به نام color دریافت می‌کند. علامت تساوی و رشته‌ای که پس از آن می‌آید به پایتون اعلام می‌دارد که مقدار رنگ را در صورت عدم تعیین به صورت plain تنظیم کند. می‌توانید تنظیمات را مطابق با نیاز کاری‌تان تغییر دهید و رنگ خودروی خود را در زمان ساخت مشخص کنید:

red_car = Vehicle(color=’red’)
green_car = Vehicle(color=’green’)
blue_car = Vehicle(color=’blue’)

اگر رنگ خودرو را چاپ کنید مشاهده می‌کنید که هر نمونه رنگ متفاوتی دارد، هر چند هر سه دارای کلاس یکسانی هستند. پایتون تقریباً امکان دسترسی به هر متغیر یا شیئ را می‌دهد، در حالی که بیشتر زبان‌ها اجازه انجام چنین کارهایی را نمی‌دهند:

print(red_car.color)
print(green_car.color)
print(blue_car.color)

دلیل عملکرد قطعه کد فوق این است که  color به self.color تخصیص پیدا کرده است. Self نیز یک کلیدواژه اختصاصی دیگر پایتون است که از آن برای اشاره به هر نمونه خاصی از یک کلاس استفاده می‌شود.

وقتی از Self استفاده می‌کنید، می‌توانید به داده‌های خاص آن نمونه دست پیدا کنید یا آن‌ها را تغییر دهید. به‌طور مثال، خودروی قرمز، رنگ قرمز دارد. به‌علاوه، این امکان وجود دارد که متد –init—را برای ذخیره صدای خودرو نیز تغییر داد:

self.noise = ‘Vroooom’

برای نمایش صدای خودرو می‌توانید همانند کاری که در مورد color کردیم به متغیر noise  دسترسی داشته باشید،اما این روش جالبی نیست. هنگامی که مشغول رانندگی با یک خودرو هستید، اگر بخواهید کدهای دیگری را روی آن اعمال کنید و احتمالاً کدهایی که تاکنون حتی ننوشته‌اید، چه اتفاقی برای خودرو رخ می‌دهد یا اگر بخواهید شیوه هدایت یک خودرو را در آینده تغییر دهید، چه اتفاقی خواهد افتاد؟

با ایجاد یک تابع که متد (method) نامیده می‌شود، می‌توانید نحوه انجام همه چیز را به دقت کنترل کنید. کد زیر را در زیر متد –init— به شرح زیر اضافه کنید:

def drive(self):
print(self.noise)

این متد شبیه به قطعه کد زیر فراخوانی می‌شود:

red_car.drive()

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

آشنایی با متغیرهای خصوصی در پایتون

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

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

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

با این حال، پایتون قرارداد پذیرفته‌شده‌ای برای خصوصی ساختن برخی از متغیرها دارد که معنی ضمنی آن این است که این متغیر برای استفاده خصوصی تعریف شده و نباید به آن دست بزنید. در این قرارداد به صورت پیشوند نام متغیر با زیرخط شرح داده می‌شود:

_some_secret_variable = 42

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

پایتون برای کار با اشیای خصوصی به این شکل عمل می‌کند، اما همه چیز با مسئولیت شما است، زیرا ممکن است این متغیرها درست کار نکنند.

وراثت در پایتون

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

کد زیر را به کلاس Vehicle اضافه کنید:

class ElectricCar(Vehicle):
“”” Electric vehicle class. “””
def charge(self):
print(‘Zzz’)
electric_car = ElectricCar()
electric_car.charge()
electric_car.noise = ‘Whoosh’
electric_car.drive()

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

خودروی الکتریکی متدهای خاص خود را دارد. این خودرو می‌تواند شارژ شود که سایر خودروها این قابلیت را ندارند. با تغییر صدای خودرو و هدایت آن می‌بینید که خودروی الکتریکی صدای متفاوتی ایجاد می‌کند. نیازی نیست که متد Drive خودرو را تعریف کنید. دلیل این امر آن است که این متد از والد به ارث رسیده است.

فراگیری دانش را متوقف نکنید

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

نویسنده: حمیدرضا تائبی

منبع: https://www.makeuseof.com/tag/python-object-oriented-programming/

 

ثبت ديدگاه