چندریختی (Polymorphism) یکی از اصول مهم برنامهنویسی شیگرا (OOP) است که اجازه میدهد یک متد با نام یکسان در کلاسهای مختلف رفتار متفاوتی داشته باشد.
مثال ساده از چندریختی:
class Dog:def speak(self):return "Woof!"class Cat:def speak(self):return "Meow!"animals = [Dog(), Cat()]for animal in animals:print(animal.speak())
در این مثال، متد speak در هر دو کلاس Dog و Cat وجود دارد ولی خروجی متفاوتی دارد.
متدهای جادویی در پایتون متدهایی هستند که با دو آندرلاین (__) در ابتدا و انتها نامگذاری میشوند. این متدها به کلاسها امکان میدهند که بهطور ویژه در رفتارهای داخلی پایتون شرکت کنند.
چند نمونه از متدهای جادویی:
__init__ : سازنده کلاس__str__ : نمایش خوانای کلاس برای کاربران__repr__ : نمایش رسمی کلاس برای دیباگینگ__len__ : مقدار طول یک شیء را مشخص میکندمثال:
class Person:def __init__(self, name, age):self.name = nameself.age = agedef __str__(self):return f"{self.name}, {self.age} years old"def __repr__(self):return f"Person('{self.name}', {self.age})"def __len__(self):return self.agep = Person("Ali", 25)print(str(p)) # خروجی: Ali, 25 years oldprint(repr(p)) # خروجی: Person('Ali', 25)print(len(p)) # خروجی: 25
کلاسهای انتزاعی کلاسهایی هستند که نمیتوان از آنها مستقیماً شیء ساخت و صرفاً بهعنوان الگو برای کلاسهای دیگر عمل میکنند.
استفاده از ABC:
from abc import ABC, abstractmethodclass Animal(ABC):@abstractmethoddef make_sound(self):passclass Dog(Animal):def make_sound(self):return "Woof!"class Cat(Animal):def make_sound(self):return "Meow!"# animal = Animal() # این کد خطا میدهد چون Animal یک کلاس انتزاعی استdog = Dog()print(dog.make_sound()) # Woof!
در اینجا Animal یک کلاس انتزاعی است و متد make_sound باید در کلاسهای فرزند پیادهسازی شود.
مدیریت استثناها (Exception Handling) در برنامهنویسی شیگرا کمک میکند که برنامهها پایدارتر باشند و در صورت بروز خطاها، از کرش کردن برنامه جلوگیری شود.
مثال مدیریت استثناها در کلاسها:
class Calculator:def divide(self, a, b):try:return a / bexcept ZeroDivisionError:return "Cannot divide by zero!"calc = Calculator()print(calc.divide(10, 2)) # 5.0print(calc.divide(10, 0)) # Cannot divide by zero!
با استفاده از try-except، از بروز خطای تقسیم بر صفر جلوگیری کردیم و یک پیام مناسب نمایش دادیم.