1. آموزش وراثت در پایتون
ارثبری (Inheritance) در پایتون به شما امکان میدهد تا یک کلاس جدید ایجاد کنید که ویژگیها و متدهای یک کلاس دیگر (والد) را به ارث میبرد. این رویکرد برای اشتراکگذاری کد و افزایش قابلیت استفاده مجدد استفاده میشود.
ساختار کلی:
class ParentClass:
def __init__(self, attribute):
self.attribute = attribute
def parent_method(self):
print("This is a method in the parent class")
class ChildClass(ParentClass):
def __init__(self, attribute, additional_attribute):
super().__init__(attribute)
self.additional_attribute = additional_attribute
def child_method(self):
print("This is a method in the child class")
توضیح:
- کلاس
ParentClassیک کلاس پایه است که دارای یک ویژگی و یک متد است. - کلاس
ChildClassازParentClassارث میبرد و یک ویژگی جدید و یک متد خاص خود را اضافه میکند. - از
super()برای فراخوانی سازنده کلاس والد استفاده شده است.
مثال ساده برای ارثبری:
کلاس والد و فرزند:
class Vehicle:
def __init__(self, brand, model):
self.brand = brand
self.model = model
def display_info(self):
print(f"Brand: {self.brand}, Model: {self.model}")
class Car(Vehicle):
def __init__(self, brand, model, doors):
super().__init__(brand, model)
self.doors = doors
def display_info(self):
super().display_info()
print(f"Doors: {self.doors}")
class Motorcycle(Vehicle):
def __init__(self, brand, model, engine_type):
super().__init__(brand, model)
self.engine_type = engine_type
def display_info(self):
super().display_info()
print(f"Engine Type: {self.engine_type}")
# استفاده از کلاسها
car = Car("Toyota", "Corolla", 4)
motorcycle = Motorcycle("Yamaha", "MT-07", "Parallel Twin")
car.display_info()
motorcycle.display_info()
توضیح:
- کلاس
Vehicleویژگیهای عمومی مانند برند و مدل را تعریف میکند. - کلاس
CarازVehicleارث میبرد و ویژگی خاصی به نامdoorsرا اضافه میکند. - کلاس
Motorcycleنیز ازVehicleارث میبرد و ویژگی جدیدی به نامengine_typeاضافه میکند. - از متد
super()برای فراخوانی متد کلاس والد استفاده شده است.
خروجی:
Brand: Toyota, Model: Corolla
Doors: 4
Brand: Yamaha, Model: MT-07
Engine Type: Parallel Twin
ارثبری چندسطحی (Multilevel Inheritance):
در این نوع ارثبری، یک کلاس از کلاس دیگری ارث میبرد که خود نیز از کلاس دیگری ارث برده است.
مثال:
class Animal:
def __init__(self, name):
self.name = name
def make_sound(self):
print("Some generic sound")
class Mammal(Animal):
def __init__(self, name, has_fur):
super().__init__(name)
self.has_fur = has_fur
class Dog(Mammal):
def __init__(self, name, has_fur, breed):
super().__init__(name, has_fur)
self.breed = breed
def make_sound(self):
print("Woof Woof")
# استفاده از کلاسها
dog = Dog("Buddy", True, "Golden Retriever")
print(f"Name: {dog.name}, Has Fur: {dog.has_fur}, Breed: {dog.breed}")
dog.make_sound()
توضیح:
- کلاس
Animalویژگی عمومی نام را تعریف میکند. - کلاس
Mammalویژگی خاصی به نامhas_furاضافه میکند. - کلاس
Dogکه ازMammalارث میبرد، یک ویژگی جدید به نامbreedاضافه کرده و متدmake_soundرا بازنویسی کرده است.
خروجی:
Name: Buddy, Has Fur: True, Breed: Golden Retriever
Woof Woof
1.2 ارثبری چندگانه (Multiple Inheritance):
در این نوع ارثبری، یک کلاس میتواند از بیش از یک کلاس والد ارث ببرد.
مثال:
class Flyable:
def fly(self):
print("I can fly")
class Walkable:
def walk(self):
print("I can walk")
class Bird(Flyable, Walkable):
def make_sound(self):
print("Chirp Chirp")
# استفاده از کلاس
bird = Bird()
bird.fly()
bird.walk()
bird.make_sound()
توضیح:
- کلاس
FlyableوWalkableهر کدام رفتارهای خاصی را تعریف میکنند. - کلاس
Birdاز هر دو کلاس ارث میبرد و رفتارهای پرواز و راه رفتن را به همراه متد جدید خود ارائه میدهد.
خروجی:
I can fly
I can walk
Chirp Chirp
2. گسترش کلاسها و استفاده از متدهای پدر و مادر
شما میتوانید کلاسهایی را ایجاد کنید که از کلاسهای موجود ارث ببرند و متدهای جدید یا ویژگیهایی به آنها اضافه کنند. همچنین میتوانید از متدهای والد (Parent) در کلاس فرزند (Child) استفاده کنید.
ساختار کلی برای گسترش کلاس:
class ParentClass:
def __init__(self, attribute):
self.attribute = attribute
def parent_method(self):
print(f"Attribute from parent: {self.attribute}")
class ChildClass(ParentClass):
def __init__(self, attribute, child_attribute):
super().__init__(attribute)
self.child_attribute = child_attribute
def child_method(self):
print(f"Attribute from child: {self.child_attribute}")
توضیح:
- کلاس فرزند از ویژگیها و متدهای کلاس والد ارث میبرد.
- با استفاده از
super()، میتوانید سازنده (Constructor) کلاس والد را فراخوانی کنید.
مثال برای گسترش کلاس و استفاده از متدهای والد:
class Employee:
def __init__(self, name, salary):
self.name = name
self.salary = salary
def display_info(self):
print(f"Name: {self.name}, Salary: {self.salary}")
class Manager(Employee):
def __init__(self, name, salary, department):
super().__init__(name, salary)
self.department = department
def display_info(self):
super().display_info() # فراخوانی متد کلاس والد
print(f"Department: {self.department}")
# استفاده از کلاسها
manager = Manager("Ali", 50000, "IT")
manager.display_info()
خروجی:
Name: Ali, Salary: 50000
Department: IT
توضیح:
- کلاس
Employeeویژگیها و متدی برای نمایش اطلاعات عمومی دارد. - کلاس
ManagerازEmployeeارث میبرد و ویژگی جدیدی به نامdepartmentاضافه میکند. - متد
display_infoدر کلاسManagerمتد کلاس والد را گسترش میدهد.
بازنویسی متدها (Method Overriding):
شما میتوانید متدی از کلاس والد را در کلاس فرزند بازنویسی کنید تا رفتار جدیدی ارائه دهید.
مثال:
class Animal:
def make_sound(self):
print("Some generic animal sound")
class Dog(Animal):
def make_sound(self):
print("Woof Woof")
# استفاده از کلاسها
animal = Animal()
dog = Dog()
animal.make_sound() # خروجی: Some generic animal sound
dog.make_sound() # خروجی: Woof Woof
توضیح:
- کلاس
Dogمتدmake_soundرا بازنویسی کرده است تا صدای خاص سگ را تولید کند.
مثال پیشرفته:
class Vehicle:
def start_engine(self):
print("Engine started")
class ElectricCar(Vehicle):
def start_engine(self):
print("Electric engine started silently")
# استفاده از کلاسها
vehicle = Vehicle()
electric_car = ElectricCar()
vehicle.start_engine() # خروجی: Engine started
electric_car.start_engine() # خروجی: Electric engine started silently
توضیح:
- کلاس
ElectricCarمتدstart_engineرا بازنویسی کرده تا رفتار موتور الکتریکی را شبیهسازی کند.
ترکیب متدهای والد و فرزند:
در پایتون میتوانید متدهای کلاس والد را در کنار متدهای کلاس فرزند استفاده کنید.
مثال:
class Shape:
def __init__(self, color):
self.color = color
def display_info(self):
print(f"Color: {self.color}")
class Rectangle(Shape):
def __init__(self, color, width, height):
super().__init__(color)
self.width = width
self.height = height
def display_info(self):
super().display_info() # فراخوانی متد کلاس والد
print(f"Width: {self.width}, Height: {self.height}")
# استفاده از کلاسها
rectangle = Rectangle("Red", 10, 5)
rectangle.display_info()
خروجی:
Color: Red
Width: 10, Height: 5
توضیح:
- کلاس
Rectangleاز ویژگیها و متد کلاسShapeاستفاده میکند و اطلاعات جدیدی اضافه میکند.
ترکیب ویژگیهای اضافی با متدهای والد:
مثال:
class Person:
def __init__(self, name):
self.name = name
def greet(self):
print(f"Hello, my name is {self.name}.")
class Student(Person):
def __init__(self, name, school):
super().__init__(name)
self.school = school
def greet(self):
super().greet()
print(f"I study at {self.school}.")
# استفاده از کلاسها
student = Student("Sara", "High School")
student.greet()
خروجی:
Hello, my name is Sara.
I study at High School.
توضیح:
- کلاس
Studentمتدgreetرا از کلاس والد گسترش میدهد و اطلاعات اضافی اضافه میکند.
به طور کلی می توان گفت:
گسترش کلاسها و استفاده از متدهای پدر و مادر در پایتون یکی از قابلیتهای قدرتمند این زبان برای توسعه کدهای مقیاسپذیر و قابل استفاده مجدد است. با استفاده از ارثبری و بازنویسی متدها، میتوان کلاسهای جدیدی ایجاد کرد که ویژگیها و رفتارهای متفاوتی ارائه دهند، در حالی که هنوز از ساختار و قابلیتهای کلاسهای والد بهره میبرند. این روش، نه تنها باعث کاهش کدنویسی تکراری میشود، بلکه به توسعهدهندگان این امکان را میدهد تا سیستمهایی پیچیدهتر و قابل مدیریتتر ایجاد کنند. به همین دلیل، درک عمیق از ارثبری و نحوه استفاده از متدهای والد و فرزند، برای برنامهنویسان شیءگرا ضروری است.
