از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
برنامه نویسی شی گرا در پایتون
سرفصلهای مطلب
معرفی
برنامه نویسی شی گرا (OOP) یک پارادایم برنامه نویسی است که در آن اجزای مختلف یک برنامه کامپیوتری بر اساس اشیاء دنیای واقعی مدل می شوند. شی به هر چیزی گفته می شود که دارای ویژگی هایی باشد و بتواند عملکردی را انجام دهد.
سناریویی را در نظر بگیرید که در آن باید یک بازی اتومبیل رانی فرمول 1 با استفاده از رویکرد برنامه نویسی شی گرا توسعه دهید. اولین کاری که باید انجام دهید این است که اشیاء دنیای واقعی را در مسابقه واقعی فرمول 1 شناسایی کنید. چه موجوداتی در مسابقه فرمول 1 هستند که دارای برخی ویژگی ها هستند و می توانند هر عملکردی را انجام دهند؟ یکی از پاسخ های واضح به این سوال خودرو است. یک خودرو می تواند دارای ویژگی هایی مانند ظرفیت موتور، ساخت، مدل، سازنده و غیره باشد روی. به طور مشابه، یک ماشین را می توان راه اندازی کرد، متوقف کرد، شتاب داد و غیره روی. راننده می تواند شی دیگری در مسابقه فرمول 1 باشد. راننده دارای ملیت، سن، جنسیت و غیره است روی، و او می تواند عملکردهایی مانند رانندگی ماشین، حرکت دادن فرمان یا تغییر گیربکس را انجام دهد.
درست مانند این مثال، در برنامه نویسی شی گرا، ما اشیایی را برای موجودیت دنیای واقعی مربوطه ایجاد می کنیم.
در اینجا ذکر این نکته ضروری است که برنامه نویسی شی گرا یک مفهوم وابسته به زبان نیست. این یک مفهوم کلی برنامه نویسی است و بیشتر زبان های مدرن مانند جاوا، سی شارپ، سی پلاس پلاس و پایتون از برنامه نویسی شی گرا پشتیبانی می کنند. در این مقاله به معرفی دقیق برنامه نویسی شی گرا در پایتون خواهیم پرداخت، اما قبل از آن برخی از مزایا و معایب برنامه نویسی شی گرا را خواهیم دید.
مزایا و معایب OOP
برخی از مزایای برنامه نویسی شی گرا به شرح زیر است:
- برنامه نویسی شی گرا قابلیت استفاده مجدد را تقویت می کند. یک برنامه کامپیوتری به شکل آبجکت ها و کلاس ها نوشته می شود که می توان از آن ها در پروژه های دیگر نیز استفاده کرد.
- رویکرد مدولار مورد استفاده در برنامه نویسی شی گرا منجر به کد بسیار قابل نگهداری می شود.
- در برنامه نویسی شی گرا، هر کلاس وظیفه خاصی دارد. اگر خطایی در بخشی از کد رخ داد، میتوانید آن را به صورت محلی بدون تأثیرگذاری بر سایر قسمتهای کد تصحیح کنید.
- کپسوله سازی داده ها (که در ادامه مقاله به بررسی آن خواهیم پرداخت) یک لایه امنیتی اضافی به برنامه توسعه یافته با استفاده از رویکرد شی گرا اضافه می کند.
اگرچه برنامه نویسی شی گرا مزایای متعددی دارد، اما دارای معایبی نیز می باشد که برخی از آنها در زیر ذکر شده است:
- دانش دامنه دقیق از نرم افزار در حال توسعه برای ایجاد اشیاء مورد نیاز است. هر موجودی در نرم افزار کاندیدای پیاده سازی به عنوان یک شی نیست. تشخیص این خط ظریف برای تازه کارها ممکن است سخت باشد.
- با اضافه کردن کلاس های بیشتر و بیشتری به کد، اندازه و پیچیدگی برنامه به طور تصاعدی افزایش می یابد.
در بخش بعدی برخی از مهمترین مفاهیم برنامه نویسی شی گرا را مشاهده خواهیم کرد.
همانطور که از نام آن پیداست، برنامه نویسی شی گرا همه چیز درباره اشیا است. با این حال، قبل از ایجاد یک شی، باید کلاس را برای شی تعریف کنیم.
کلاس
یک کلاس در برنامه نویسی شی گرا به عنوان طرحی برای شی عمل می کند. یک کلاس را می توان به عنوان نقشه خانه در نظر گرفت. با دیدن نقشه می توانید تصوری از ظاهر خانه داشته باشید. با این حال، یک کلاس خود چیزی نیست. به عنوان مثال، نقشه یک خانه نیست، بلکه فقط توضیح می دهد که خانه واقعی چگونه به نظر می رسد.
رابطه بین کلاس و شی را می توان با نگاه کردن به رابطه بین خودرو و آئودی درک کرد. آئودی در واقع یک ماشین است. با این حال، چیزی به نام ماشین وجود ندارد. ماشین یک مفهوم انتزاعی است، در واقع در قالب تویوتا، فراری، هوندا و غیره پیاده سازی می شود.
کلمه کلیدی class
برای ایجاد کلاس در پایتون استفاده می شود. نام کلاس به دنبال آن است class
کلمه کلیدی و به دنبال آن کاراکتر کولون. بدنه کلاس شروع می شود روی یک خط جدید، یک برگه از سمت چپ تورفتگی دارد.
بیایید ببینیم چگونه می توانیم یک کلاس بسیار ابتدایی در پایتون ایجاد کنیم. به کد زیر دقت کنید:
class Car:
name = "c200"
make = "mercedez"
model = 2008
def start(self):
print ("Engine started")
def stop(self):
print ("Engine switched off")
در مثال بالا، کلاسی به نام ایجاد می کنیم Car
با سه ویژگی: name
، make
، و model
. را car
کلاس همچنین شامل دو روش است: start()
و stop()
.
اشیاء
قبلاً گفتیم که یک کلاس یک طرح اولیه ارائه می دهد. با این حال، برای استفاده واقعی از اشیاء و متدهای یک کلاس، باید یک را ایجاد کنید هدف – شی خارج از آن کلاس تعداد کمی از متدها و ویژگی های کلاس وجود دارد که می توانند بدون شی مورد استفاده قرار گیرند که در بخش بعدی خواهیم دید. در حال حاضر، فقط به خاطر داشته باشید که به طور پیش فرض، قبل از اینکه بتوانیم از متدها و ویژگی های آن استفاده کنیم، باید یک شی از یک کلاس ایجاد کنیم.
به یک شیء نمونه نیز گفته می شود. بنابراین، process ایجاد یک شی از یک کلاس نامیده می شود نمونه سازی. در پایتون، برای ایجاد یک شی از یک کلاس، فقط باید نام کلاس را بنویسیم و پرانتز را باز و بسته کنیم.
بیایید یک شی از the ایجاد کنیم Car
کلاسی که در قسمت آخر ایجاد کردیم.
car_a = Car()
car_b = Car()
در اسکریپت بالا، دو شی از کلاس ماشین ایجاد کردیم: car_a
و car_b
. برای بررسی نوع اشیایی که ایجاد کردیم، می توانیم از آن استفاده کنیم type
متد و نام شیء خود را به آن منتقل می کنیم. اسکریپت زیر را اجرا کنید:
print(type(car_b))
در خروجی مشاهده خواهید کرد:
<class '__main__.Car'>
که می گوید که نوع car_b
شی یک کلاس است Car
.
در این مرحله ما کلاس خود و اشیاء مربوطه را ایجاد کرده ایم. اکنون زمان دسترسی به ویژگی های کلاس و فراخوانی متد کلاس با استفاده از شی کلاس است. برای انجام این کار، شما به سادگی باید نام شی را بنویسید، سپس عملگر نقطه و نام ویژگی یا روشی را که می خواهید به آن دسترسی داشته باشید یا فراخوانی کنید. به مثال زیر دقت کنید:
car_b.start()
در اسکریپت بالا، ما را صدا می کنیم start()
روش از طریق car_b
هدف – شی. خروجی به صورت زیر خواهد بود:
Engine started
به طور مشابه، می توانید با استفاده از نحو زیر به یک ویژگی دسترسی داشته باشید:
print(car_b.model)
در خروجی مقدار the را خواهید دید model
ویژگی، همانطور که در زیر نشان داده شده است:
2008
ویژگی های
در بخش قبل دیدیم که چگونه میتوانیم اشیاء یک کلاس را ایجاد کنیم و از آن اشیا برای دسترسی به ویژگیهای یک کلاس استفاده کنیم.
در پایتون، هر شیء علاوه بر ویژگی های تعریف شده توسط کاربر، دارای برخی ویژگی ها و روش های پیش فرض است. برای دیدن تمام ویژگی ها و روش های یک شی، داخلی dir()
تابع می تواند استفاده شود. بیایید سعی کنیم تمام ویژگی های the را ببینیم car_b
شی ای که در قسمت آخر ایجاد کردیم. اسکریپت زیر را اجرا کنید:
dir(car_b)
در خروجی، ویژگی های زیر را مشاهده خواهید کرد:
('__class__',
'__delattr__',
'__dict__',
'__dir__',
'__doc__',
'__eq__',
'__format__',
'__ge__',
'__getattribute__',
'__gt__',
'__hash__',
'__init__',
'__init_subclass__',
'__le__',
'__lt__',
'__module__',
'__ne__',
'__new__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__setattr__',
'__sizeof__',
'__str__',
'__subclasshook__',
'__weakref__',
'make',
'model',
'name',
'start',
'stop')
این تابع داخلی برای بازرسی تمام ویژگی ها و توابع یک شی مفید است، به خصوص زمانی که از طریق REPL پایتون استفاده می شود.
کلاس در مقابل ویژگی های نمونه
ویژگی ها را می توان به طور کلی به دو نوع دسته بندی کرد: ویژگی های کلاس و ویژگی های نمونه. ویژگی های کلاس توسط همه اشیاء یک کلاس به اشتراک گذاشته می شود در حالی که ویژگی های نمونه دارایی انحصاری نمونه هستند.
به یاد داشته باشید، یک نمونه فقط نام دیگری برای شی است. ویژگی های نمونه در داخل هر متد اعلان می شوند در حالی که ویژگی های کلاس خارج از هر متد اعلان می شوند. مثال زیر تفاوت را روشن می کند:
class Car:
car_count = 0
def start(self, name, make, model):
print ("Engine started")
self.name = name
self.make = make
self.model = model
Car.car_count += 1
در اسکریپت بالا یک کلاس ایجاد می کنیم Car
با یک ویژگی کلاس car_count
و سه ویژگی نمونه name
، make
و mode
. کلاس شامل یک متد است start()
که شامل سه ویژگی نمونه است. مقادیر ویژگی های نمونه به عنوان آرگومان به آن ارسال می شوند start()
روش. درون start
روش، car_count
ویژگی با یک افزایش می یابد.
ذکر این نکته ضروری است که در داخل متد، ویژگی های نمونه با استفاده از عبارت ارجاع می شوند self
کلمه کلیدی، در حالی که ویژگی های کلاس با نام کلاس ارجاع می شوند.
بیایید یک شی از the ایجاد کنیم Car
کلاس و تماس بگیرید start()
روش.
car_a = Car()
car_a.start("Corrola", "Toyota", 2015)
print(car_a.name)
print(car_a.car_count)
در اسکریپت بالا ما print ویژگی نمونه name
و صفت کلاس car_count
. در خروجی خواهید دید که car_count
همانطور که در زیر نشان داده شده است، ویژگی مقدار 1 خواهد داشت:
Engine started
Corrola
1
حال، بیایید یک شی دیگر از the ایجاد کنیم car
کلاس و تماس بگیرید start()
روش.
car_b = Car()
car_b.start("City", "Honda", 2013)
print(car_b.name)
print(car_b.car_count)
حالا اگر شما print ارزش car_count
ویژگی، 2 را در خروجی خواهید دید. این به این دلیل است که car_count
ویژگی یک ویژگی کلاس است و از این رو بین نمونه ها به اشتراک گذاشته می شود. را car_a
شی مقدار خود را به 1 افزایش داد در حالی که car_b
شی دوباره آن را افزایش داد، بنابراین مقدار نهایی 2 شد. خروجی به این صورت است:
Engine started
City
2
مواد و روش ها
همانطور که قبلا توضیح دادیم، در برنامه نویسی شی گرا، از روش ها برای پیاده سازی عملکردهای یک شی استفاده می شود. در قسمت قبل ایجاد کردیم start()
و stop()
روش هایی برای Car
کلاس تاکنون از اشیاء یک کلاس برای فراخوانی متدها استفاده کرده ایم. با این حال، یک نوع متد وجود دارد که می توان آن را مستقیماً با استفاده از نام کلاس فراخوانی کرد. چنین روشی a نامیده می شود ایستا روش.
روش های استاتیک
برای اعلام یک متد استاتیک، باید آن را مشخص کنید @staticmethod
توصیفگر قبل از نام متد مطابق شکل زیر:
class Car:
@staticmethod
def get_class_details():
print ("This is a car class")
Car.get_class_details()
در اسکریپت بالا یک کلاس ایجاد می کنیم Car
با یک روش استاتیک get_class_details()
. بیایید این متد را با استفاده از نام کلاس فراخوانی کنیم.
Car.get_class_details()
می بینید که ما نیازی به ایجاد یک نمونه از آن نداشتیم Car
کلاس به منظور تماس با get_class_details()
روش، ما به سادگی از نام کلاس استفاده کردیم. ذکر این نکته ضروری است که روش های استاتیک فقط می توانند دسترسی داشته باشند کلاس ویژگی ها در پایتون
برگرداندن چندین مقدار از یک روش
یکی از بهترین ویژگی های زبان پایتون، توانایی متدهای کلاس برای برگرداندن چندین مقدار است. به مثال زیر دقت کنید:
class Square:
@staticmethod
def get_squares(a, b):
return a*a, b*b
print(Square.get_squares(3, 5))
در اسکریپت بالا کلاسی به نام ایجاد کردیم Square
با یک روش استاتیک get_squares()
. این روش دو پارامتر دارد. هر پارامتر را با خودش ضرب کنید و هر دو نتیجه را با استفاده از آن برمی گرداند return
بیانیه. در خروجی اسکریپت بالا مربع های 3 و 5 را مشاهده خواهید کرد.
را خ روش
تا به حال ما ویژگی ها را با استفاده از آن چاپ می کردیم print()
روش. بیایید ببینیم چه اتفاقی می افتد اگر ما print موضوع یک کلاس
برای انجام این کار ما یک ساده ایجاد می کنیم Car
کلاس با یک روش و سعی کنید print شیء کلاس به console. اسکریپت زیر را اجرا کنید:
class Car:
# create class methods
def start(self):
print ("Engine started")
car_a = Car()
print(car_a)
در اسکریپت بالا ایجاد می کنیم car_a
موضوع از Car
کلاس و print ارزش آن روی صفحه نمایش اساساً در اینجا ما در حال درمان هستیم car_a
شی به عنوان یک رشته خروجی به شکل زیر است:
<__main__.Car object at 0x000001CCCF4335C0>
خروجی مکان حافظه را نشان می دهد که شی ما در آن ذخیره می شود. هر شی پایتون دارای یک است __str__
روش به طور پیش فرض وقتی از شی به عنوان رشته استفاده می کنید، __str__
متد فراخوانی می شود که به طور پیش فرض مکان حافظه شی را چاپ می کند. با این حال، شما می توانید تعریف خود را برای آن ارائه دهید __str__
روش نیز به عنوان مثال به مثال زیر نگاه کنید:
class Car:
def __str__(self):
return "Car class Object"
def start(self):
print ("Engine started")
car_a = Car()
print(car_a)
در اسکریپت بالا، ما را لغو می کنیم __str__
روش با ارائه تعریف سفارشی خودمان برای روش. حالا اگر شما print را car_a
شی، پیام “شیء کلاس خودرو” را خواهید دید. روی را console. این پیامی است که ما در داخل سفارشی خود چاپ کردیم __str__
روش.
با استفاده از این روش می توانید توضیحات سفارشی و معنادارتری برای زمانی که یک شی چاپ می شود ایجاد کنید. حتی می توانید برخی از داده ها را در کلاس نمایش دهید، مانند name
از یک Person
کلاس
سازندگان
سازنده یک متد خاص است که هر زمان که یک شی از یک کلاس ایجاد می کنید به طور پیش فرض فراخوانی می شود.
برای ایجاد یک سازنده، باید یک متد با کلمه کلیدی ایجاد کنید __init__
. به مثال زیر دقت کنید:
class Car:
car_count = 0
def __init__(self):
Car.car_count +=1
print(Car.car_count)
در اسکریپت بالا، a را ایجاد می کنیم Car
کلاس با یک ویژگی کلاس car_count
. کلاس حاوی سازنده ای است که مقدار آن را افزایش می دهد car_count
و مقدار حاصل را چاپ می کند روی صفحه نمایش
در حال حاضر، هر زمان که یک شی از Car
کلاس ایجاد خواهد شد سازنده فراخوانی می شود، مقدار the car_count
افزایش یافته و نمایش داده می شود روی صفحه نمایش بیایید یک شی ساده ایجاد کنیم و ببینیم چه اتفاقی می افتد:
car_a = Car()
car_b = Car()
car_c = Car()
در خروجی، مقدار 1، 2 و 3 را مشاهده خواهید کرد زیرا با هر شی مقدار car_count
متغیر افزایش یافته و نمایش داده می شود روی صفحه نمایش
به جز نام، سازنده را می توان به عنوان یک روش معمولی استفاده کرد. شما می توانید مقادیر را از یک سازنده ارسال و دریافت کنید. معمولاً زمانی که می خواهید مقادیر ویژگی را پس از نمونه سازی کلاس مقداردهی اولیه کنید، به این شکل استفاده می شود.
Local در مقابل متغیرهای جهانی
می دانیم که دو نوع ویژگی پایتون وجود دارد، ویژگی های نمونه و ویژگی های کلاس. به ویژگی های یک کلاس، متغیر نیز گفته می شود. بسته به روی دامنه، متغیرها را نیز می توان به دو نوع طبقه بندی کرد: Local متغیرها و متغیرهای جهانی.
Local متغیرها
یک متغیر محلی در یک کلاس، متغیری است که فقط در داخل بلوک کد که در آن تعریف شده است قابل دسترسی است. به عنوان مثال، اگر متغیری را در داخل یک متد تعریف کنید، در هیچ کجای خارج از آن متد قابل دسترسی نیست. به اسکریپت زیر نگاه کنید:
class Car:
def start(self):
message = "Engine started"
return message
در اسکریپت بالا یک متغیر محلی ایجاد می کنیم message
درون start()
روش از Car
کلاس حالا بیایید یک شی از the ایجاد کنیم Car
کلاس و سعی کنید به متغیر محلی دسترسی پیدا کنید message
همانطور که در زیر نشان داده شده است:
car_a = Car()
print(car_a.message)
اسکریپت بالا خطای زیر را برمی گرداند:
AttributeError: 'Car' object has no attribute 'message'
این به این دلیل است که ما نمی توانیم به متغیر محلی خارج از بلوکی که متغیر محلی در آن تعریف شده است دسترسی پیدا کنیم.
متغیر جهانی
یک متغیر سراسری خارج از هر بلوک کدی تعریف میشود، مثلاً متدها، if-statements، و غیره. یک متغیر سراسری را میتوان در هر نقطهای از کلاس مشاهده کرد. به مثال زیر دقت کنید.
class Car:
message1 = "Engine started"
def start(self):
message2 = "Car started"
return message2
car_a = Car()
print(car_a.message1)
در اسکریپت بالا، یک متغیر سراسری ایجاد کردیم message1
و ارزش آن را چاپ کرد روی صفحه نمایش در خروجی مقدار the را خواهید دید message1
متغیر، بدون خطا چاپ شده است.
ذکر این نکته ضروری است که بین ویژگیهای کلاس و نمونه و متغیرهای محلی و جهانی تفاوت وجود دارد. ویژگیهای کلاس و نمونه در روش دسترسی به آنها، یعنی استفاده از نام کلاس و استفاده از نام نمونه، متفاوت است. از سوی دیگر، متغیرهای محلی و جهانی از نظر دامنه یا به عبارت دیگر مکانی که می توان به آنها دسترسی داشت، متفاوت است. یک متغیر محلی فقط در داخل متد قابل دسترسی است. اگرچه در این مقاله، هر دو ویژگی متغیر محلی و نمونه در داخل متد تعریف شده اند، ویژگی محلی با کلمه کلیدی self تعریف شده است.
دسترسی به اصلاح کننده ها
اصلاح کننده های دسترسی در پایتون برای تغییر دامنه پیش فرض متغیرها استفاده می شوند. سه نوع تغییر دهنده دسترسی در پایتون وجود دارد: عمومی، خصوصی و محافظت شده.
متغیرهای دارای اصلاحکننده دسترسی عمومی را میتوان در هر نقطهای در داخل یا خارج از کلاس مورد دسترسی قرار داد، متغیرهای خصوصی فقط در داخل کلاس قابل دسترسی هستند، در حالی که متغیرهای محافظت شده را میتوان در همان بسته دسترسی داشت.
برای ایجاد یک متغیر خصوصی، باید پیشوند زیرخط دوگانه با نام متغیر قرار دهید. برای ایجاد یک متغیر محافظت شده، باید یک زیرخط با نام متغیر پیشوند قرار دهید. برای متغیرهای عمومی، اصلاً لازم نیست هیچ پیشوندی اضافه کنید.
بیایید متغیرهای عمومی، خصوصی و محافظت شده را در عمل ببینیم. اسکریپت زیر را اجرا کنید:
class Car:
def __init__(self):
print ("Engine started")
self.name = "corolla"
self.__make = "toyota"
self._model = 1999
در اسکریپت بالا یک ساده ایجاد می کنیم Car
کلاس با سازنده و سه متغیر name
، make
، و model
. را name
متغیر عمومی است در حالی که make
و model
متغیرها به ترتیب خصوصی و محافظت شده اعلام شده اند.
بیایید یک شی از the ایجاد کنیم Car
کلاس و سعی کنید به آن دسترسی داشته باشید name
متغیر. اسکریپت زیر را اجرا کنید:
car_a = Car()
print(car_a.name)
از آنجا که name
یک متغیر عمومی است، بنابراین می توانیم خارج از کلاس به آن دسترسی داشته باشیم. در خروجی مقدار the را خواهید دید name
چاپ شده روی را console.
حالا بیایید سعی کنیم print ارزش make
متغیر. اسکریپت زیر را اجرا کنید:
print(car_a.make)
در خروجی پیغام خطای زیر را مشاهده خواهید کرد:
AttributeError: 'Car' object has no attribute 'make'
ما بیشتر مفاهیم اولیه برنامه نویسی شی گرا را در چند بخش اخیر پوشش داده ایم. حال، بیایید در مورد ارکان برنامه نویسی شی گرا صحبت کنیم: چند شکلی، وراثت، و کپسولاسیون، که در مجموع به عنوان PIE شناخته می شوند.
وراثت
وراثت در برنامه نویسی شی گرا تقریباً شبیه به ارث بردن در دنیای واقعی است که در آن کودک برخی از ویژگی ها را علاوه بر ویژگی های منحصر به فرد خود از والدین خود به ارث می برد.
در برنامه نویسی شی گرا، وراثت به معنای یک رابطه IS-A است. به عنوان مثال، یک ماشین هست یک وسیله نقلیه. وراثت یکی از شگفت انگیزترین مفاهیم برنامه نویسی شی گرا است زیرا قابلیت استفاده مجدد کد را تقویت می کند.
ایده اصلی وراثت در برنامه نویسی شی گرا این است که یک کلاس می تواند ویژگی های یک کلاس دیگر را به ارث ببرد. کلاسی که کلاس دیگری را به ارث می برد the نامیده می شود کلاس کودک یا کلاس مشتق شده، و کلاسی که توسط کلاس دیگری به ارث می رسد نامیده می شود والدین یا کلاس پایه
بیایید نگاهی به یک مثال بسیار ساده از وراثت بیندازیم. اسکریپت زیر را اجرا کنید:
class Vehicle:
def vehicle_method(self):
print("This is parent Vehicle class method")
class Car(Vehicle):
def car_method(self):
print("This is child Car class method")
در اسکریپت بالا دو کلاس ایجاد می کنیم Vehicle
کلاس، و Car
کلاس که به ارث می برد Vehicle
کلاس برای به ارث بردن یک کلاس، فقط باید نام کلاس والد را در داخل پرانتزی که بعد از نام کلاس فرزند قرار می گیرد، بنویسید. را Vehicle
کلاس شامل یک متد است vehicle_method()
و کلاس فرزند حاوی یک متد است car_method()
. با این حال، از آنجایی که Car
کلاس به ارث می برد Vehicle
کلاس، خواهد شد همچنین را به ارث ببرند vehicle_method()
.
بیایید این را در عمل ببینیم. اسکریپت زیر را اجرا کنید:
car_a = Car()
car_a.vehicle_method()
در اسکریپت بالا، یک شی از the ایجاد می کنیم Car
کلاس و تماس بگیرید vehicle_method()
با استفاده از آن Car
شی کلاس می توانید ببینید که Car
کلاس هیچی نداره vehicle_method()
اما از آنجایی که آن را به ارث برده است Vehicle
کلاسی که شامل vehicle_method()
، کلاس خودرو نیز می تواند از آن استفاده کند. خروجی به شکل زیر است:
This is parent Vehicle class method
در پایتون، یک کلاس والد می تواند چندین فرزند داشته باشد و به طور مشابه، یک کلاس فرزند می تواند چندین کلاس والد داشته باشد. بیایید نگاهی به سناریوی اول بیندازیم. اسکریپت زیر را اجرا کنید:
class Vehicle:
def vehicle_method(self):
print("This is parent Vehicle class method")
class Car(Vehicle):
def car_method(self):
print("This is child Car class method")
class Cycle(Vehicle):
def cycleMethod(self):
print("This is child Cycle class method")
در اسکریپت بالای والد Vehicle
کلاس توسط دو کلاس فرزند به ارث می رسد Car
و Cycle
. هر دو کلاس کودک به آن دسترسی خواهند داشت vehicle_method()
از کلاس والدین اسکریپت زیر را اجرا کنید تا ببینید:
car_a = Car()
car_a.vehicle_method()
car_b = Cycle()
car_b.vehicle_method()
در خروجی، خروجی را خواهید دید vehicle_method()
روش دو بار مطابق شکل زیر:
This is parent Vehicle class method
This is parent Vehicle class method
می توانید ببینید که چگونه یک کلاس والد توسط دو کلاس فرزند به ارث می رسد. به همین ترتیب، یک کودک می تواند چندین والدین داشته باشد. بیایید نگاهی به مثال بیندازیم:
class Camera:
def camera_method(self):
print("This is parent Camera class method")
class Radio:
def radio_method(self):
print("This is parent Radio class method")
class CellPhone(Camera, Radio):
def cell_phone_method(self):
print("This is child CellPhone class method")
در اسکریپت بالا سه کلاس ایجاد می کنیم: Camera
، Radio
، و CellPhone
. را Camera
کلاس و Radio
کلاس ها به ارث برده می شوند CellPhone
کلاس که به این معنی است که CellPhone
کلاس به متدهای هر دو دسترسی خواهد داشت Camera
و Radio
کلاس ها. اسکریپت زیر این را تایید می کند:
cell_phone_a = CellPhone()
cell_phone_a.camera_method()
cell_phone_a.radio_method()
خروجی به شکل زیر است:
This is parent Camera class method
This is parent Radio class method
پلی مورفیسم
اصطلاح چندشکلی در لغت به معنای داشتن اشکال متعدد است. در زمینه برنامه نویسی شی گرا، پلی مورفیسم به توانایی یک شی برای رفتار به طرق مختلف اشاره دارد.
چند شکلی در برنامه نویسی از طریق روش اضافه بار و جایگزینی روش پیاده سازی می شود.
روش اضافه بار
اضافه بار روش به ویژگی یک روش اشاره دارد که بسته به تعداد یا انواع پارامترها به روش های مختلف رفتار می کند. به یک مثال بسیار ساده از بارگذاری بیش از حد روش نگاه کنید. اسکریپت زیر را اجرا کنید:
class Car:
def start(self, a, b=None):
if b is not None:
print (a + b)
else:
print (a)
در اسکریپت بالا، اگر start()
متد با ارسال یک آرگومان فراخوانی می شود، پارامتر چاپ می شود روی صفحه نمایش با این حال، اگر 2 آرگومان را به start()
روش، هم آرگومان ها و هم will را اضافه می کند print حاصل جمع
بیایید ابتدا با استدلال واحد تلاش کنیم:
car_a = Car()
car_a.start(10)
در خروجی، 10 را خواهید دید. حالا بیایید سعی کنیم 2 آرگومان را ارسال کنیم:
car_a.start(10,20)
در خروجی عدد 30 را مشاهده خواهید کرد.
نادیده گرفتن روش
Method overriding به داشتن متدی با همان نام در کلاس فرزند با کلاس والد اشاره دارد. تعریف روش در کلاسهای والد و فرزند متفاوت است، اما نام آن ثابت میماند. بیایید یک روش مثال ساده را در پایتون در نظر بگیریم.
class Vehicle:
def print_details(self):
print("This is parent Vehicle class method")
class Car(Vehicle):
def print_details(self):
print("This is child Car class method")
class Cycle(Vehicle):
def print_details(self):
print("This is child Cycle class method")
در اسکریپت بالا Car
و Cycle
کلاس ها به ارث می برند Vehicle
کلاس کلاس خودرو دارد print_details()
روشی که توسط کلاس های فرزند لغو می شود. حالا اگر شما تماس بگیرید print_details()
روش، خروجی به شیئی که متد از طریق آن فراخوانی می شود بستگی دارد. اسکریپت زیر را اجرا کنید تا این مفهوم را در عمل ببینید:
car_a = Vehicle()
car_a. print_details()
car_b = Car()
car_b.print_details()
car_c = Cycle()
car_c.print_details()
خروجی به شکل زیر خواهد بود:
This is parent Vehicle class method
This is child Car class method
This is child Cycle class method
می توانید ببینید که خروجی متفاوت است، اگرچه print_details()
متد از طریق کلاس های مشتق شده از همان کلاس پایه فراخوانی می شود. با این حال، از آنجایی که کلاس های فرزند متد کلاس والد را لغو کرده اند، روش ها متفاوت رفتار می کنند.
کپسوله سازی
کپسوله سازی سومین رکن برنامه نویسی شی گرا است. کپسولاسیون به سادگی به پنهان کردن داده ها اشاره دارد. به عنوان یک اصل کلی، در برنامه نویسی شی گرا، یک کلاس نباید به داده های کلاس دیگر دسترسی مستقیم داشته باشد. در عوض، دسترسی باید از طریق متدهای کلاس کنترل شود.
برای ارائه دسترسی کنترل شده به داده های کلاس در پایتون، از اصلاح کننده ها و ویژگی های دسترسی استفاده می شود. ما قبلاً اصلاح کننده های دسترسی را دیده ایم، در این قسمت ویژگی ها را در عمل خواهیم دید.
فرض کنید می خواهیم اطمینان حاصل کنیم که مدل خودرو باید همیشه بین 2000 و 2018 باشد. اگر کاربری سعی کند مقدار کمتر از 2000 را برای مدل خودرو وارد کند، مقدار به طور خودکار روی 2000 تنظیم می شود و اگر مقدار وارد شده بزرگتر از 2018 باشد، باید روی 2018 تنظیم شود. اگر مقدار بین 2000 و 2018 باشد، نباید تغییر کند. ما می توانیم برای ویژگی model یک خاصیت ایجاد کنیم که این منطق را به صورت زیر پیاده سازی می کند:
class Car:
def __init__(self, model):
self.model = model
@property
def model(self):
return self.__model
@model.setter
def model(self, model):
if model < 2000:
self.__model = 2000
elif model > 2018:
self.__model = 2018
else:
self.__model = model
def getCarModel(self):
return "The car model is " + str(self.model)
carA = Car(2088)
print(carA.getCarModel())
یک ملک دارای سه قسمت است. شما باید ویژگی را تعریف کنید که این است model
در اسکریپت بالا در مرحله بعد، باید با استفاده از decorator @property، ویژگی را برای ویژگی تعریف کنید. در نهایت، شما باید تنظیم کننده خاصیت را ایجاد کنید @model.setter
توصیفگر در اسکریپت بالا
حال، اگر بخواهید مقداری بیشتر از 2018 را برای ویژگی model وارد کنید، می بینید که مقدار روی 2018 تنظیم شده است. بیایید این را آزمایش کنیم. اسکریپت زیر را اجرا کنید:
car_a = Car(2088)
print(car_a.get_car_model())
در اینجا ما از 2088 به عنوان مقدار عبور می کنیم model
، با این حال اگر شما print ارزش برای model
ویژگی از طریق get_car_model()
تابع، 2018 را در خروجی خواهید دید.
نتیجه
در این مقاله به بررسی برخی از مهمترین مفاهیم برنامه نویسی شی گرا پرداختیم. برنامه نویسی شی گرا یکی از معروف ترین و رایج ترین پارادایم های برنامه نویسی است. اهمیت برنامه نویسی شی گرا با این واقعیت منعکس می شود که بیشتر زبان های برنامه نویسی مدرن یا کاملاً شی گرا هستند یا از برنامه نویسی شی گرا پشتیبانی می کنند.
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-26 15:16:05