از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
پلی مورفیسم در پایتون چیست؟ با مثال توضیح داده شده است

سرفصلهای مطلب
پلی مورفیسم یک اصل برنامه نویسی شی گرا (OOP) است که به شما در نوشتن نرم افزار با کیفیت ، انعطاف پذیر ، قابل استفاده ، قابل استفاده مجدد ، قابل آزمایش و قابل خواندن کمک می کند. اگر قصد دارید با نرم افزار شی گرا کار کنید ، درک پلی مورفیسم بسیار مهم است.
پلی مورفیسم چیست؟
کلمه چند شکل از یونانی مشتق شده و به معنای “داشتن چندین شکل” است:
-
پلی = بسیاری
-
MORPH = فرم ها
در برنامه نویسی ، پلی مورفیسم توانایی یک شیء در شکل های مختلف استبشر
مزیت اصلی پلی مورفیسم این است که به ما امکان می دهد بیشتر بنویسیم عمومی وت قابل استفاده مجدد کد به جای نوشتن منطق جداگانه برای کلاسهای مختلف ، رفتارهای مشترک را در کلاس والدین تعریف می کنیم و اجازه می دهیم کلاس های کودک در صورت لزوم از آنها غلبه کند. این نیاز به بیش از حد را از بین می برد if-else
چک ، باعث می شود کد قابل حفظ و گسترده تر باشد.
چارچوب های MVC مانند Django از پلی مورفیسم استفاده می کنند تا کد انعطاف پذیر تر شود. به عنوان مثال ، Django از پایگاه داده های مختلف مانند SQLite ، MySQL و PostgreSQL پشتیبانی می کند. به طور معمول ، هر پایگاه داده برای تعامل با آن به کد متفاوتی نیاز دارد ، اما Django یک API واحد پایگاه داده را ارائه می دهد که با همه آنها کار می کند. این بدان معنی است که شما می توانید همان کد را برای عملیات پایگاه داده بنویسید ، مهم نیست که از کدام پایگاه داده استفاده می کنید. بنابراین ، اگر یک پروژه را با SQLITE شروع کرده و بعداً به PostgreSQL تغییر دهید ، به لطف پلی مورفیسم نیازی به بازنویسی بخش اعظم کد خود ندارید.
در این مقاله ، برای درک آسان کارها ، من یک نمونه کد بد و بدون پلی مورفیسم را به شما نشان می دهم. ما در مورد موضوعاتی که این کد بد ایجاد می کند ، بحث خواهیم کرد و سپس با استفاده مجدد از کد برای استفاده از پلی مورفیسم ، مسائل را حل می کنیم.
(BTW ، اگر با فیلم بهتر می آموزید ، پلی مورفیسم من را در فیلم YouTube Python بررسی کنید.)
اول ، مثالی بدون پلی مورفیسم:
class Car:
def __init__(self, brand, model, year, number_of_doors):
self.brand = brand
self.model = model
self.year = year
self.number_of_doors = number_of_doors
def start(self):
print("Car is starting.")
def stop(self):
print("Car is stopping.")
class Motorcycle:
def __init__(self, brand, model, year):
self.brand = brand
self.model = model
self.year = year
def start_bike(self):
print("Motorcycle is starting.")
def stop_bike(self):
print("Motorcycle is stopping.")
بیایید بگوییم که ما می خواهیم لیستی از وسایل نقلیه ایجاد کنیم ، سپس از طریق آن حلقه کنیم و یک بازرسی را انجام دهیم روی هر وسیله نقلیه:
# Create list of vehicles to inspect
vehicles = [
Car("Ford", "Focus", 2008, 5),
Motorcycle("Honda", "Scoopy", 2018),
]
# Loop through list of vehicles and inspect them
for vehicle in vehicles:
if isinstance(vehicle, Car):
print(f"Inspecting {vehicle.brand} {vehicle.model} ({type(vehicle).__name__})")
vehicle.start()
vehicle.stop()
elif isinstance(vehicle, Motorcycle):
print(f"Inspecting {vehicle.brand} {vehicle.model} ({type(vehicle).__name__})")
vehicle.start_bike()
vehicle.stop_bike()
else:
raise Exception("Object is not a valid vehicle")
به کد زشت در داخل توجه کنید for
حلقه! چون vehicles
لیستی از هر نوع شیء است ، ما باید بفهمیم که قبل از اینکه بتوانیم به هر اطلاعاتی دسترسی پیدا کنیم ، با چه نوع شیئی در داخل هر حلقه سر و کار داریم روی شی
با اضافه کردن انواع وسایل نقلیه بیشتر ، این کد همچنان زشت تر می شود. به عنوان مثال ، اگر ما تمدید شده پایگاه کد ما شامل یک جدید است Plane
کلاس ، پس ما نیاز داریم تغییر دادن (و به طور بالقوه شکستن) کد موجود – ما باید یک چک مشروط دیگر را در این مورد اضافه کنیم for
حلقه برای هواپیماها.
معرفی: پلی مورفیسم …
اتومبیل و موتور سیکلت هر دو وسیله نقلیه هستند. آنها هر دو برخی از خصوصیات و روشهای مشترک را به اشتراک می گذارند. بنابراین ، بیایید یک کلاس والدین ایجاد کنیم که حاوی این خصوصیات و روشهای مشترک باشد:
کلاس والدین (یا “سوپر کلاس”):
class Vehicle:
def __init__(self, brand, model, year):
self.brand = brand
self.model = model
self.year = year
def start(self):
print("Vehicle is starting.")
def stop(self):
print("Vehicle is stopping.")
Car
وت Motorcycle
اکنون می تواند ارث از Vehicle
بشر بیایید کلاسهای کودک (یا “زیر کلاس”) را ایجاد کنیم Vehicle
سوپر کلاس:
class Car(Vehicle):
def __init__(self, brand, model, year, number_of_doors):
super().__init__(brand, model, year)
self.number_of_doors = number_of_doors
# Below, we "override" the start and stop methods, inherited from Vehicle, to provide car-specific behaviour
def start(self):
print("Car is starting.")
def stop(self):
print("Car is stopping.")
class Motorcycle(Vehicle):
def __init__(self, brand, model, year):
super().__init__(brand, model, year)
# Below, we "override" the start and stop methods, inherited from Vehicle, to provide bike-specific behaviour
def start(self):
print("Motorcycle is starting.")
def stop(self):
print("Motorcycle is stopping.")
Car
وت Motorcycle
هر دو گسترش می یابد Vehicle
، زیرا آنها وسیله نقلیه هستند. اما نکته چیست Car
وت Motorcycle
هر دو گسترش می یابند Vehicle
اگر آنها قصد دارند نسخه های خاص خود را اجرا کنند start()
وت stop()
روشها؟ به کد زیر نگاه کنید:
# Create list of vehicles to inspect
vehicles = [Car("Ford", "Focus", 2008, 5), Motorcycle("Honda", "Scoopy", 2018)]
# Loop through list of vehicles and inspect them
for vehicle in vehicles:
if isinstance(vehicle, Vehicle):
print(f"Inspecting {vehicle.brand} {vehicle.model} ({type(vehicle).__name__})")
vehicle.start()
vehicle.stop()
else:
raise Exception("Object is not a valid vehicle")
در این مثال:
-
ما یک لیست داریم ،
vehicles
، حاوی موارد هر دوCar
وتMotorcycle
بشر -
ما از طریق هر وسیله نقلیه در لیست تکرار می شویم و یک بازرسی عمومی انجام می دهیم روی هرکدام
-
بازرسی process شامل شروع وسیله نقلیه ، چک کردن برند و مدل آن و متوقف کردن آن پس از آن است.
-
با وجود وسایل نقلیه از انواع مختلف ، پلی مورفیسم به ما اجازه می دهد تا با همه آنها به عنوان نمونه های پایه رفتار کنیم
Vehicle
کلاس. پیاده سازی های خاصstart()
وتstop()
روشهای مربوط به هر نوع وسیله نقلیه در زمان اجرا ، به صورت پویا فراخوانی می شوند روی نوع واقعی هر وسیله نقلیه.
زیرا لیست می تواند تنها حاوی اشیاء است که گسترش می یابد Vehicle
کلاس ، ما می دانیم که هر شیء برخی از زمینه ها و روش های مشترک را به اشتراک می گذارد. این بدان معنی است که ما می توانیم با خیال راحت با آنها تماس بگیریم ، بدون اینکه نگران این باشیم که هر وسیله نقلیه خاص دارای این زمینه ها یا روش ها باشد.
این نشان می دهد که چگونه پلی مورفیسم باعث می شود کد به صورت عمومی تر و انعطاف پذیر تر نوشته شود و امکان گسترش آسان و نگهداری را فراهم می کند زیرا انواع جدید وسایل نقلیه به سیستم اضافه می شوند.
به عنوان مثال ، اگر می خواستیم وسیله نقلیه دیگری را به لیست اضافه کنیم ، لازم نیست کد مورد استفاده برای بازرسی وسایل نقلیه (“کد مشتری”) را اصلاح کنیم. در عوض ، ما فقط می توانیم تمدید کردن پایه کد ما (یعنی یک کلاس جدید ایجاد کنید) ، بدون اصلاح کننده کد موجود:
class Plane(Vehicle):
def __init__(self, brand, model, year, number_of_doors):
super().__init__(brand, model, year)
self.number_of_doors = number_of_doors
def start(self):
print("Plane is starting.")
def stop(self):
print("Plane is stopping.")
# Create list of vehicles to inspect
vehicles = [
Car("Ford", "Focus", 2008, 5),
Motorcycle("Honda", "Scoopy", 2018),
########## ADD A PLANE TO THE LIST: #########
Plane("Boeing", "747", 2015, 16),
############################################
]
کد برای انجام بازرسی های وسیله نقلیه نیازی به تغییر هواپیما ندارد. همه چیز هنوز هم کار می کند ، بدون اینکه منطق بازرسی ما را اصلاح کنیم.
پایان
پلی مورفیسم به مشتریان اجازه می دهد تا انواع مختلفی از اشیاء را به همان روش درمان کنند. این امر انعطاف پذیری نرم افزار و قابلیت حفظ نرم افزار را تا حد زیادی بهبود می بخشد ، زیرا کلاس های جدید بدون نیاز به اصلاح (اغلب با اضافه کردن اضافی می توانند ایجاد شوند. if
/else if
بلوک) کد کار و آزمایش شده موجود.
یادگیری بیشتر
پلی مورفیسم مربوط به بسیاری از اصول برنامه نویسی شی گرا دیگر ، مانند تزریق وابستگی و باز اصل جامد اگر می خواهید به OOP تسلط داشته باشید ، دوره Udemy من را بررسی کنید:
- Python OOP: برنامه نویسی شی گرا از مبتدی به طرفدار
اگر کتاب را به فیلم ترجیح می دهید ، کتابهای من را بررسی کنید:
-
آمازون کیندل و شومیز
-
Gumroad PDF 📖
ممنون از خواندن 🙂
منتشر شده در 1404-02-06 20:43:14