برنامه‌نویسی شی‌گرا در پایتون: چیت شیت مختصر و مفید

فهرست مطالب

“`html

برنامه‌نویسی شی‌گرا در پایتون: چیت شیت مختصر و مفید

برنامه‌نویسی شی‌گرا (Object-Oriented Programming یا OOP) یک پارادایم برنامه‌نویسی قدرتمند است که به شما امکان می‌دهد کد خود را به روشی سازمان‌یافته و قابل‌استفاده مجدد ساختاربندی کنید. پایتون به طور کامل از OOP پشتیبانی می‌کند و ابزارهای لازم برای ایجاد کلاس‌ها، اشیاء و پیاده‌سازی مفاهیم کلیدی مانند وراثت، چندریختی و کپسوله‌سازی را فراهم می‌کند. این چیت شیت برای برنامه‌نویسان با تجربه پایتون طراحی شده است که می‌خواهند یک مرجع سریع و مختصر برای مفاهیم و سینتکس OOP در پایتون داشته باشند.

چرا برنامه‌نویسی شی‌گرا؟

قبل از ورود به جزئیات، بیایید به این سوال پاسخ دهیم که چرا اصلاً باید از OOP استفاده کنیم. مزایای OOP عبارتند از:

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

مفاهیم کلیدی OOP

برای استفاده مؤثر از OOP، باید با مفاهیم کلیدی آن آشنا باشید:

  • کلاس (Class): یک الگو یا طرح اولیه برای ایجاد اشیاء. کلاس تعریف می‌کند که اشیاء از چه ویژگی‌ها (attributes) و رفتارهایی (methods) برخوردار خواهند بود.
  • شیء (Object): یک نمونه (instance) از یک کلاس. هر شیء دارای ویژگی‌ها و رفتارهای خاص خود است که در کلاس تعریف شده‌اند.
  • ویژگی (Attribute): یک متغیر که به یک شیء تعلق دارد. ویژگی‌ها داده‌هایی را ذخیره می‌کنند که وضعیت یک شیء را نشان می‌دهند.
  • متد (Method): یک تابع که به یک شیء تعلق دارد. متدها رفتارهایی را تعریف می‌کنند که یک شیء می‌تواند انجام دهد.
  • وراثت (Inheritance): مکانیزمی که به یک کلاس (کلاس فرزند یا subclass) اجازه می‌دهد ویژگی‌ها و متدهای یک کلاس دیگر (کلاس پدر یا superclass) را به ارث ببرد.
  • چندریختی (Polymorphism): توانایی یک شیء برای داشتن اشکال مختلف. به عبارت دیگر، اشیاء مختلف می‌توانند به یک پیام به روش‌های مختلف پاسخ دهند.
  • کپسوله‌سازی (Encapsulation): پنهان کردن جزئیات پیاده‌سازی داخلی یک شیء از دنیای خارج. کپسوله‌سازی به شما امکان می‌دهد از داده‌های یک شیء در برابر دسترسی غیرمجاز محافظت کنید و تغییرات داخلی را بدون تأثیر بر سایر قسمت‌های کد خود اعمال کنید.
  • انتزاع (Abstraction): نمایش دادن ویژگی‌ها و رفتارهای ضروری یک شیء به کاربر، در حالی که جزئیات غیرضروری پنهان می‌شوند.

سینتکس پایتون برای OOP

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

تعریف کلاس

برای تعریف یک کلاس در پایتون، از کلمه کلیدی class استفاده می‌کنیم:


 class Dog:
  def __init__(self, name, breed):
  self.name = name
  self.breed = breed

  def bark(self):
  print("Woof!")
 

در این مثال، ما یک کلاس به نام Dog تعریف کرده‌ایم. این کلاس دارای دو ویژگی (name و breed) و یک متد (bark) است.

متد __init__

متد __init__ یک متد ویژه است که به عنوان سازنده (constructor) کلاس عمل می‌کند. این متد زمانی فراخوانی می‌شود که یک شیء از کلاس ایجاد می‌شود. از متد __init__ برای مقداردهی اولیه ویژگی‌های یک شیء استفاده می‌شود.

پارامتر self در متد __init__ به شیء در حال ایجاد اشاره دارد. هر متدی که در یک کلاس تعریف می‌کنید باید پارامتر self را به عنوان اولین پارامتر خود داشته باشد.

ایجاد شیء

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


 my_dog = Dog("Buddy", "Golden Retriever")
 

این کد یک شیء به نام my_dog از کلاس Dog ایجاد می‌کند. ویژگی‌های name و breed این شیء به ترتیب با مقادیر “Buddy” و “Golden Retriever” مقداردهی اولیه می‌شوند.

دسترسی به ویژگی‌ها و متدها

برای دسترسی به ویژگی‌ها و متدهای یک شیء، از عملگر نقطه (.) استفاده می‌کنیم:


 print(my_dog.name)  # Output: Buddy
 my_dog.bark()      # Output: Woof!
 

وراثت

برای ایجاد یک کلاس فرزند که از یک کلاس پدر ارث می‌برد، نام کلاس پدر را در پرانتز بعد از نام کلاس فرزند مشخص می‌کنیم:


 class Bulldog(Dog):
  def __init__(self, name):
  super().__init__(name, "Bulldog")

  def snore(self):
  print("Zzzzz...")
 

در این مثال، ما یک کلاس به نام Bulldog ایجاد کرده‌ایم که از کلاس Dog ارث می‌برد. کلاس Bulldog دارای یک متد جدید به نام snore است. همچنین، متد __init__ کلاس Bulldog با فراخوانی super().__init__(name, "Bulldog") سازنده کلاس پدر را فراخوانی می‌کند تا ویژگی‌های name و breed را مقداردهی اولیه کند.

چندریختی

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


 class Cat:
  def speak(self):
  print("Meow!")

 class Dog:
  def speak(self):
  print("Woof!")

 animals = [Cat(), Dog()]

 for animal in animals:
  animal.speak()
  # Output:
  # Meow!
  # Woof!
 

در این مثال، هر دو کلاس Cat و Dog دارای یک متد به نام speak هستند. با این حال، هر کلاس این متد را به روش خاص خود پیاده‌سازی می‌کند. وقتی متد speak را روی هر شیء در لیست animals فراخوانی می‌کنیم، هر شیء به روش مناسب خود پاسخ می‌دهد.

کپسوله‌سازی

کپسوله‌سازی به شما امکان می‌دهد داده‌های داخلی یک شیء را از دنیای خارج پنهان کنید. در پایتون، معمولاً این کار با استفاده از قراردادهای نام‌گذاری انجام می‌شود. ویژگی‌ها و متدهایی که با یک زیرخط (_) شروع می‌شوند، به عنوان خصوصی (private) در نظر گرفته می‌شوند و نباید مستقیماً از خارج از کلاس به آن‌ها دسترسی پیدا کرد. ویژگی‌ها و متدهایی که با دو زیرخط (__) شروع می‌شوند، به عنوان بسیار خصوصی (strongly private) در نظر گرفته می‌شوند و نام آن‌ها به گونه‌ای تغییر می‌کند که دسترسی به آن‌ها حتی از کلاس‌های فرزند نیز دشوارتر شود.


 class BankAccount:
  def __init__(self, balance):
  self._balance = balance  # Protected attribute
  self.__account_number = 12345  # Strongly private attribute

  def deposit(self, amount):
  self._balance += amount

  def get_balance(self):
  return self._balance

 my_account = BankAccount(1000)
 print(my_account.get_balance())  # Output: 1000
 my_account.deposit(500)
 print(my_account.get_balance())  # Output: 1500
 # print(my_account.__account_number)  # This will raise an AttributeError
 print(my_account._balance) # Accessing a protected attribute is possible, but discouraged. Output: 1500
 

در این مثال، ویژگی _balance یک ویژگی محافظت‌شده (protected) است و ویژگی __account_number یک ویژگی بسیار خصوصی است. در حالی که از نظر فنی می‌توان به ویژگی _balance از خارج از کلاس دسترسی پیدا کرد، این کار به طور کلی توصیه نمی‌شود. تلاش برای دسترسی به ویژگی __account_number منجر به یک AttributeError خواهد شد، زیرا نام آن تغییر یافته است.

انتزاع

انتزاع به شما امکان می‌دهد جزئیات غیرضروری را پنهان کرده و فقط ویژگی‌ها و رفتارهای ضروری را به کاربر نشان دهید. در پایتون، انتزاع اغلب با استفاده از کلاس‌های انتزاعی (abstract classes) و متدهای انتزاعی (abstract methods) پیاده‌سازی می‌شود. یک کلاس انتزاعی کلاسی است که نمی‌توان از آن شیء ایجاد کرد. متدهای انتزاعی متدهایی هستند که هیچ پیاده‌سازی ندارند و باید توسط کلاس‌های فرزند پیاده‌سازی شوند.


 from abc import ABC, abstractmethod

 class Shape(ABC):
  @abstractmethod
  def area(self):
  pass

 class Rectangle(Shape):
  def __init__(self, width, height):
  self.width = width
  self.height = height

  def area(self):
  return self.width * self.height

 # shape = Shape()  # TypeError: Can't instantiate abstract class Shape with abstract methods area
 rectangle = Rectangle(5, 10)
 print(rectangle.area())  # Output: 50
 

در این مثال، کلاس Shape یک کلاس انتزاعی است که دارای یک متد انتزاعی به نام area است. کلاس Rectangle از کلاس Shape ارث می‌برد و متد area را پیاده‌سازی می‌کند. تلاش برای ایجاد یک شیء از کلاس Shape منجر به یک TypeError خواهد شد.

بهترین شیوه‌ها برای OOP در پایتون

برای نوشتن کد OOP خوب در پایتون، به این نکات توجه کنید:

  • اصل تک مسئولیتی (Single Responsibility Principle): هر کلاس باید فقط یک مسئولیت داشته باشد. این اصل به شما کمک می‌کند تا کلاس‌هایی ایجاد کنید که آسان‌تر قابل درک، نگهداری و تست باشند.
  • اصل باز/بسته (Open/Closed Principle): کلاس‌ها باید برای توسعه باز و برای تغییر بسته باشند. به عبارت دیگر، باید بتوانید رفتار یک کلاس را بدون تغییر کد اصلی آن گسترش دهید.
  • اصل جایگزینی لیسکوف (Liskov Substitution Principle): کلاس‌های فرزند باید بتوانند جایگزین کلاس‌های پدر خود شوند بدون اینکه برنامه را خراب کنند.
  • اصل جداسازی رابط (Interface Segregation Principle): کلاینت‌ها نباید مجبور به پیاده‌سازی رابط‌هایی شوند که از آن‌ها استفاده نمی‌کنند.
  • اصل وارونگی وابستگی (Dependency Inversion Principle): ماژول‌های سطح بالا نباید به ماژول‌های سطح پایین وابسته باشند. هر دو باید به انتزاع‌ها وابسته باشند. انتزاع‌ها نباید به جزئیات وابسته باشند. جزئیات باید به انتزاع‌ها وابسته باشند.
  • استفاده از Docstring: برای مستندسازی کلاس‌ها، متدها و ویژگی‌ها از docstring استفاده کنید. Docstringها توضیحات کوتاهی هستند که در ابتدای یک کلاس یا متد قرار می‌گیرند.
  • نام‌گذاری مناسب: از نام‌های توصیفی برای کلاس‌ها، متدها و ویژگی‌ها استفاده کنید. این کار به خوانایی کد شما کمک می‌کند.
  • پرهیز از وراثت بیش از حد: وراثت بیش از حد می‌تواند منجر به پیچیدگی و دشواری در نگهداری کد شود. در صورت امکان، از ترکیب (composition) به جای وراثت استفاده کنید.
  • نوشتن تست‌های واحد: برای اطمینان از اینکه کد OOP شما به درستی کار می‌کند، تست‌های واحد بنویسید.

الگوهای طراحی (Design Patterns) در OOP

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

  • الگوی Singleton: تضمین می‌کند که یک کلاس فقط یک نمونه دارد و یک نقطه دسترسی جهانی به آن نمونه فراهم می‌کند.
  • الگوی Factory: یک رابط برای ایجاد اشیاء فراهم می‌کند، اما به کلاس‌های فرزند اجازه می‌دهد تا نوع اشیاء ایجاد شده را تعیین کنند.
  • الگوی Observer: یک رابطه یک به چند بین اشیاء تعریف می‌کند، به طوری که وقتی یک شیء تغییر می‌کند، همه اشیاء وابسته به آن مطلع می‌شوند.
  • الگوی Strategy: به شما امکان می‌دهد الگوریتم‌ها را در زمان اجرا انتخاب کنید.
  • الگوی Decorator: به شما امکان می‌دهد رفتار یک شیء را به صورت پویا بدون تغییر کد آن اضافه کنید.

نتیجه‌گیری

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


“`

“تسلط به برنامه‌نویسی پایتون با هوش مصنوعی: آموزش کدنویسی هوشمند با ChatGPT”

قیمت اصلی 2.290.000 ریال بود.قیمت فعلی 1.590.000 ریال است.

"تسلط به برنامه‌نویسی پایتون با هوش مصنوعی: آموزش کدنویسی هوشمند با ChatGPT"

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

ویژگی‌های کلیدی:

بدون نیاز به تجربه قبلی برنامه‌نویسی

زیرنویس فارسی با ترجمه حرفه‌ای

۳۰ ٪ تخفیف ویژه برای دانشجویان و دانش آموزان