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

مقدمه آموزش شی گرایی در پایتون

برای آشنایی با مفاهیم پایه و یادگیری گام‌ به‌ گام کلیات برنامه نویسی شی گرا (Object-Oriented Programming)، تا پایان مطلب آموزش شی گرایی در پایتون همراه ما باشید. برنامه نویسی شی گرا که به اختصار OOP نامیده می‌شود، شیوه‌ای برگرفته از دنیای واقعی برای تفکر در برنامه نویسی است که برای اولین‌بار در سال ۱۹۶۰ میلادی مطرح شد.

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

آموزش شی گرایی در پایتون

علت پیدایش زبان شی گرا

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

رویکرد برنامه نویسی شی گرا

ابتدا باید با دو مفهوم «کلاس» یا همان “Class” و «شی» یا همان “Object” آشنا شوید. هر کلاس را می‌توان واحدی از برنامه نامید که مقادیر مشخصی داده و عملیات را در خود نگهداری می‌کند. هر شی هم حالتی (State) مشخص از یک کلاس به حساب می‌آید.

در آموزش شی گرایی در پایتون با توجه به توضیحاتی که داده شد، می‌توان گفت رویکرد برنامه نویسی شی گرا «از پایین به بالا» است که در انگلیسی به آن “Bottom-Up” می‌گوییم. طبق این رویکرد، ابتدا واحدهای کوچکی از برنامه ایجاد می‌شوند و سپس، با پیوند این واحد‌های کوچک، واحدهای بزرگ‌تر یعنی شکل کاملی از برنامه به وجود می‌آید.

در برنامه نویسی شی گرا، هر برنامه به عنوان اشیا در نظر گرفته می‌شود که با یکدیگر در تعامل هستند. برای ایجاد اشیا هم اول باید کلاس برنامه را تعریف کرد. هر کلاس، تعیین‌کننده «رفتار» (Behavior) و «صفات» (Attributes) اشیای ایجاد شده از آن است.

در ایجاد شی محدودیتی وجود ندارد و می‌توان هر تعداد شی را از یک کلاس ایجاد کرد. در این میان، هر شی بیانگر یک «حالت» یا یک «نمونه» (Instance) از کلاس خود است. اگر بخواهیم برای جا افتادن هرچه بهتر این موضوع مثالی بزنیم، می‌توانیم کارخانه تولید یک خودرو را در نظر بگیریم. در این مثال، کارخانه یک کلاس بزرگ و اجزای کوچک‌تر تشکیل‌دهنده آن مانند سیستم چرخ‌ها، سوخت، خنک‌کننده موتور و دیگر اجزا، کلاس‌های کوچک سازنده این کلاس بزرگ یعنی کارخانه هستند.

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

آشنایی با مفاهیم شی گرایی

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

نمونه‌سازی (Instantation)

با ایجاد هر شی از یک کلاس، یک نمونه ساخته می‌شود. تمام این فرآیند در شی گرایی با نام «نمونه‌سازی» (Instantation) شناخته می‌شود.

بر همین اساس، دو نوع کلاس در شی گرایی وجود دارد:

۱- کلاس‌های عادی با توانایی نمونه‌سازی (Concrete Class)

۲- کلاس‌های فاقد توانایی نمونه‌سازی (Abstract Class)

آموزش شی گرایی در پایتون: کپسوله سازی (Encapsulation)

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

کپسوله‌سازی را می‌توان امکانی برای پنهان‌سازی داده‌ها دانست.

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

متد (Method)

هر کلاس از دو بخش «اعضای داده» (Data Members) و «توابع عضو» (Member Functions) تشکیل شده است. اعضای داده همان متغیرهای درون کلاس هستند که خصوصیات و صفت‌های شی را بیان می‌کنند. طی آموزش شی گرایی در پایتون در می‌یابیم که هریک از آن‌ها به عنوان «فیلد» (Field) یا «صفت» (Attribute) نام‌گذاری می‌شوند. هر شی از یک کلاس قادر به انجام عملیاتی است که به آن توابع عضو می‌گویند. نام این توابع در شی گرایی «متد» (Method) است.

الگوی اولیه برای نوشتن برنامه‌ها به شکل زیر است:

نام شی+نقطه+نام صفت یا متد()

مانند:

car_object.color
car_object.drive()

مقداردهی اولیه (Initialization)

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

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

Methods:
drive()
stop()
Attributes:
color = ?
fuel_capacity = ?
max_speed = ?

وراثت (Inheritance)

با استفاده از مفهوم وراثت، می‌توان قابلیت استفاده مجدد از کدی که قبلاً نوشته شده است را برای ارث‌بری صفات و متدهای کلاس قبلی در کلاس‌های جدید فراهم کرد. طبق آموزش شی گرایی در پایتون، به کلاسی که از آن ارث‌بری می‌شود “Parent Class” یا “Base Class” یا “Super Class” گفته می‌شود و کلاسی که اقدام به ارث‌بری می‌کند، “Child Class” یا کلاس فرزند نام دارد. نام‌های دیگر این کلاس عبارتند از “Derived Class” یا “Subclass”.

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

به مثال زیر از ارث‌بری توجه کنید:

# A Python program to demonstrate inheritance

# Base or Super class. Note object in bracket.

# (Generally, object is made ancestor of all classes)

# In Python 3.x "class Person" is

# equivalent to "class Person(object)"
class Person(object):

# Constructor
def __init__(self, name):
self.name = name

# To get name
def getName(self):
return self.name

# To check if this person is an employee
def isEmployee(self):
return False

# Inherited or Subclass (Note Person in bracket)
class Employee(Person):

# Here we return true
def isEmployee(self):
return True

# Driver code
emp = Person("Geek1")  # An Object of Person
print(emp.getName(), emp.isEmployee())

emp = Employee("Geek2") # An Object of Employee
print(emp.getName(), emp.isEmployee())

خروجی:

Geek1 False
Geek2 True

آموزش شی گرایی در پایتون: چندریختی (Polymorphism)

چندریختی یعنی توانایی کلاس فرزند در تعریف متدهای کلاس پایه. اگر ماهی و گربه را دو کلاس در نظر بگیریم که از کلاسی به نام حیوانات ارث‌بری دارند، در می‌یابیم متد غذا خوردن در آن‌ها مشترک است اما چگونگی آن در ماهی و گربه تفاوت دارد. پس هردوی این کلاس‌ها نیازمند متد غذا خوردن مخصوص به خود هستند.

به این ترتیب، متد در کلاس‌های فرزند «بازتعریف» شده و فرایند “Method Overriding” را به وجود می‌آورد. با Override کردن یک متد، متد کلاس پایه در زیرمجموعگی متد مشابه در کلاس فرزند قرار می‌گیرد و از اشیا کلاس فرزند پنهان می‌شود.

جمع‌بندی

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