برنامه نویسی ۸۷۵۷ بازدید

پایتون برای هر چیزی از رزبری پای تا یادگیری ماشین استفاده می‌شود. با این وجود اگر می‌خواهید با هر نوع پروژه بزرگی کار کنید، باید شیوه کار پایتون با برنامه‌نویسی شیءگرا (OOP) از جمله مفهوم کلاس در برنامه نویسی به زبان پایتون را بدانید. این مقاله مفاهیم کاملاً ابتدایی برنامه‌نویسی شیءگرا در پایتون را بررسی می‌کند.

پایتون اساساً چیست؟

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

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

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

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

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

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

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

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

روش ایجاد کلاس در پایتون چنین است:

class Vehicle:
""" در این بخش خصوصیات خودرو بیان می‌شود """
pass

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

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

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

red_car = Vehicle()

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

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

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

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

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 خودرو را تعریف کنید. دلیل این امر آن است که این متد از والد به ارث رسیده است.

دانش پایتون خود را بیش از این بسط دهید

مثال‌هایی که در این راهنما ارائه کردیم به شما نشان دادند که شیءگرایی در پایتون تا چه حد ساده است. ما تنها اصول ابتدایی را بررسی کردیم؛ اما زمانی که این اصول را متوجه شدید، باقی کار ساده خواهد بود.

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

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

  • مروری بر پایتون
  • مفاهیم اولیه شی گرایی
  • متدهای Dunder – سربارگذاری
  • ارث بری (Inheritance) – چند شکلی
  • کلاس های متد و استاتیک – کلاس انتزاعی
  • مثال های تکمیلی
  • برای کسب اطلاعات بیشتر پیرامون فیلم آموزش برنامه نویسی شی گرا در Python (پایتون) و مشاهده پیش‌نمایش‌هایی از آن + کلیک کنید.

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

==

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

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

5 نظر در “برنامه‌نویسی شیءگرا در پایتون — یک راهنمای مقدماتی برای مبتدیان

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد.