آموزش شی گرایی در پایتون

موضوع
شی گرایی در پایتون، خیلی خفن و باحاله! این مفهوم واقعاً بهتون کمک میکنه تا بتونید کدهای قدرتمند و توسعهپذیر بنویسید. یعنی اینکه میتونید برنامهتون رو به بخشهای کوچیکتر تقسیم کنید و هر بخش رو به صورت مستقل توسعه بدید. با این حال، این کار بهتون امکان میده که کدتون رو خواندنیتر و راحتتر بنویسید و ازش استفاده مجدد هم بکنید.
توی این مقاله، ما قصد داریم بهتون به طور کامل توضیح بدیم که
شی گرایی در پایتون چیستو چجوری میتونید ازش استفاده کنید. از اونجایی که مفهوم شی گرایی خیلی مهمه، ما به تفصیل به مباحث پایهای و پیشرفتهتر اون میپردازیم.
در این مقاله، ما بهتون نشون میدیم که چجوری میتونید کلاسها و اشیاء بسازید و از ارثبری، پلیمورفیسم و انکپسولیشن استفاده کنید. همچنین، ما به موارد کاربردی از
شی گرایی در پایتونمیپردازیم، مثل نحوه ارتباطات و مزایا و چالش های
برنامههای شی گرا با استفاده از پایتون.فکر کنم شما به عنوان برنامهنویس، باید با مفهوم
شی گرایی تو پایتونآشنا باشید. این مفهوم بهتون قدرت و انعطاف بیشتری در طراحی و توسعه برنامهها میده و میتونید کدهایی ساده، خوانا و قابل توسعه بنویسید. علاوه بر اون، با استفاده از شی گرایی، میتونید قطعات کد رو استفاده مجدد کنید و از تکرار کردن کدها جلوگیری کنید.
خلاصهاش اینه که اگه میخواید برنامهنویسی رو به صورت حرفهای در پایتون انجام بدید، حتماً باید با شی گرایی آشنا باشید. این مفهوم بهتون قدرت بیشتری میده و میتونید برنامههایی با کیفیت و قابلیت توسعه بالا بنویسید. در ادامه سعی میکنیم به شکل ساده هر کدوم از این موارد رو بیشتر توضیح بدیم.
مفاهیم اولیه و اصول اساسی شی گرایی در پایتون
شی گرایی چیست؟
شی گرایی یعنی یه روش برنامه نویسی که باهاش میشه کدها رو بر اساس "اشیاء" یا موجوداتی که در نظر میگیریم، نوشت. این موجودات یه سری ویژگیها و رفتارها دارن که ما میتونیم براشون قوانین و قواعدی تعریف کنیم
.
حالا، وقتی میخوایم یک برنامه بنویسیم، میتونیم از این موجودات که تعریف کردیم استفاده کنیم.
کلاسها برای تعریف این موجودات استفاده میشن. یه کلاس میتونه ویژگیها (متغیرها) و رفتارها (متدها) رو داشته باشه. مثلاً اگه فرض کنیم کلاسی به نام "ماشین" داریم، میتونیم ویژگیهایی مثل "رنگ"، "سرعت" یا "قدرت موتور" رو برای اون تعریف کنیم و رفتارهایی مثل "شروع موتور" یا "توقف" رو براش تعریف کنیم.
حالا وقتشه که از این کلاسها شیء بسازیم. شیء به عبارتی نمونهای از یک کلاسه. میتونیم با استفاده از نام کلاس، یه شیء از اون بسازیم. مثلاً میتونیم یه شیء به نام "ماشین یک" از کلاس "ماشین" بسازیم و ویژگیها و رفتارهایی که براشون تعریف کردیم رو روی این شیء اعمال کنیم.
یکی از مزایای خفن شی گرایی، اینه که میتونیم از وراثت استفاده کنیم. وراثت به این معنیه که یه کلاس میتونه ویژگیها و رفتارهای یک کلاس دیگه رو به ارث ببره و از اون استفاده کنه. این باعث میشه کدها قابل استفاده مجدد باشن و همچنین کدها به راحتی قابل تغییر و اصلاح باشن.
همچنین، چندریختی یکی دیگه از مفاهیم مهم شی گراییه. یه مزیت دیگه از شی گرایی اینه که میتونیم از یه نام یا رفتار مشابه در کلاسهای مختلف استفاده کنیم. مثلاً فرض کنید یه کلاس به نام "حیوان" داریم و ویژگیها و رفتارهایی مثل "خوردن" و "خوابیدن" رو براش تعریف کردیم. حالا اگه یه کلاس دیگه به نام "گربه" داریم که از کلاس "حیوان" ارث بری کرده، میتونیم به راحتی از رفتار "خوردن" و "خوابیدن" که قبلاً تعریف کردیم، استفاده کنیم. این قابلیت رو به چندریختی میگن.
خلاصه اینه که شی گرایی یه روش برنامه نویسی قویه که باهاش میتونیم از موجودات و رفتارهای مختلف استفاده کنیم و کدهای قابل استفاده مجددی طراحی کنیم. این روش در پایتون هم قابل استفاده است و به کمک کلاسها میتونیم اشیاء بسازیم و از ویژگیها و رفتارهایشون استفاده کنیم.
کلاسها و اشیاء در پایتون: ساختاردهی و مدیریت دادهها
توی پایتون میتونیم از کلاسها و اشیاء برای ساختاردهی و مدیریت دادهها استفاده کنیم. یه کلاس میتونه یه نوع دادهای باشه که خودش ویژگیها و رفتارهای مخصوص خودش رو داره.
حالا برای ساختن یه کلاس در پایتون، از کلمه کلیدی "class" استفاده میکنیم. توی تعریف کلاس، ویژگیها (متغیرها) و رفتارها (متدها) که به اون کلاس مربوطن، تعریف میشن. مثلاً فرض کنید میخوایم یه کلاس به اسم "Person" بسازیم که ویژگیهایی مثل "نام" و "سن" داشته باشه. پس میتونیم کلاس رو به این شکل تعریف کنیم:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def say_hello(self):
print("Hello, my name is", self.name)
حالا با ساختن یه شیء (نمونه) از کلاس "Person" میتونیم از ویژگیها و رفتارهای اون استفاده کنیم. به عنوان مثال، میتونیم یه شیء به اسم "person1" از کلاس "Person" بسازیم و بعد از ویژگیها و رفتارهاش استفاده کنیم:
person1 = Person("zahra", 25)
person2 = Person("ali", 30)
توی این مثال، شیء "person1" از کلاس "Person" ساخته شده و مقادیر "علی" و 25 به عنوان نام و سن به ویژگیهای اون شیء داده شدن. بعد متد "say_hello" روی این شیء فراخوانی شد و متن "سلام! من علی هستم و 25 سال دارم." چاپ شد.
در نهایت استفاده از کلاسها و اشیاء در پایتون به شما کمک میکنه دادههاتون رو بهتر سازماندهی کنید و کنترل کنید.
ارثبری معماری شیءگرا در پایتون
در پایتون، میتونی از "ارثبری" استفاده کنی. این یعنی میتونی یک کلاس جدید بسازی که ویژگیها و کارهای کلاس قبلی رو به ارث ببره و یا تغییراتی روش اعمال کنه.
برای استفاده از ارثبری در پایتون، کافیه نام کلاسی که میخوای ازش ارث ببری رو بعد از نام کلاس جدیدت بنویسی. به عنوان مثال، فرض کن کلاس "شخص" رو داریم و میخوای یک کلاس جدید به نام "کارمند" بسازی که ویژگیها و کارهای کلاس "شخص" رو به ارث ببره. در این صورت، میتونی کلاس "کارمند" رو به این شکل تعریف کنی:
class Person:
def __init__(self, name):
self.name = name
def greet(self):
print(f"Hello! My name is {self.name}.")
class Employee(Person):
def __init__(self, name, employee_id):
super().__init__(name)
self.employee_id = employee_id
def get_employee_info(self):
print(f"I am {self.name} and my employee ID is {self.employee_id}.")
تو این مثال، کلاس "کارمند" از کلاس "شخص" ارث برده. ما از تابع
()super
استفاده کردیم تا ابتدا ویژگیهای کلاس "شخص" رو مقداردهی کنیم و بعد ویژگیهای خود کلاس "کارمند" رو تعریف کنیم. همچنین تو کلاس "کارمند"، یه متد جدید به نام "اطلاعات_کارمند" تعریف کردیم که اطلاعات مربوط به کارمند رو چاپ میکنه.
حالا میتونی یه شی از کلاس "کارمند" بسازی و از ویژگیها و کارهاش استفاده کنی:
employee1 = Employee("Ali", 12345)
employee1.greet # :خروجی () : Hello! My name is Ali.
employee1.get_employee_info # :خروجی (): I am Ali and my employee ID is 12345.
تو این مثال، شی "کارمند1" از کلاس "کارمند" ساخته شده و ویژگیهای "علی" و 12345 رو به عنوان نام و شماره کارمندی به ویژگیهای شیء اختصاص داده شده. بعد برای این که متدهای "سلام" و "اطلاعات_کارمند" رو روی این شی فراخوانی کنی، میتونی از "ارثبری" استفاده کنی. این یعنی میتونی یک کلاس جدید بسازی که ویژگیها و کارهای کلاس قبلی رو به ارث ببره و یا تغییراتی روش اعمال کنه.
پلیمورفیسم در برنامه نویسی شی گرا در پایتون
تصور کنید شما یه مغازه دارید، اونجا محصولات مختلفی میفروشید، مثل کتاب و لوازم التحریر. هر کتاب و هر لوازم التحریر میتونن قیمتشون رو نشون بدن، اما روش نشون دادن قیمت برای هر دسته محصول ممکنه فرق کنه.
حالا توی پایتون، میتونید یه کلاس پایه بسازید به اسم "محصول". تو این کلاس یه تابع به اسم "نشون دادن قیمت" دارید. بعد از این کلاس، دوتا کلاس دیگه به اسم "کتاب" و "لوازم التحریر" میسازید که از کلاس پایه "محصول" ارثبری میکنن.
در کلاس "کتاب"، تابع "نشون دادن قیمت" رو به شکلی پیادهسازی میکنید که به جز قیمت، اطلاعاتی مثل نام کتاب و نویسنده رو هم نشون بده.
در کلاس "لوازم التحریر"، تابع "نشون دادن قیمت" رو به شکلی پیادهسازی میکنید که به جز قیمت، اطلاعاتی مثل نام لوازم التحریر و برندش رو هم نشون بده.
حالا میتونید یه لیست از چیزاهای مختلف بسازید، شامل کتابها و لوازم التحریر. با استفاده از پلیمورفیسم، میتونید برای هر چیزی توی اون لیست، تابع "نشون دادن قیمت" رو صدا بزنید. هر چیز براساس نوع خودش، قیمت و اطلاعات مربوطه رو به شکل متفاوتی نشون میده.
با استفاده از پلیمورفیسم توی این مثال، میتونید با یه نام مشترک ("نشون دادن قیمت")، رفتارهای مختلفی رو در اشیاء مختلف اجرا کنید. بدین ترتیب هم مغازهتون پر از رنگ و بو میشه و هم مشتریا خوشحال میشن!
انکپسولیشن در پایتون
انکپسولیشن در پایتون به شما اجازه میده دسترسی به ویژگیها و روشها رو محدود کنید و تعیین کنید کدام ویژگیها و روشها قابل دسترسی عمومی هستن و کدامها باید مخفی بمونن.
برای ایجاد انکپسولیشن در پایتون، معمولاً از دو نشانه زیر استفاده میشه:
- نشانه زیرخط یا underscore (_) به عنوان پیشوند
- استفاده از نشانه تعجب (!) به عنوان پیشوند
class MyClass:
def __init__(self):
self.public_var = 10
self._private_var = 20
self.__protected_var = 30
def public_method(self):
print("This is a public method.")
def _private_method(self):
print("This is a private method.")
def __protected_method(self):
print("This is a protected method.")
obj = MyClass()
print(obj.public_var) # دسترسی عمومی
print(obj._private_var) # دسترسی محافظت شده
print(obj._MyClass__protected_var) # دسترسی محافظت شده برای ویژگی خصوصی
obj.public_method() # دسترسی عمومی
obj._private_method () # دسترسی محافظت شده
obj._MyClass__protected_method# دسترسی محافظت شده برای روش خصوصی ()
در این مثال، public_var و public_method به عنوان ویژگی و روش عمومی در نظر گرفته میشن و میتونن از خارج از کلاس به اونها دسترسی پیدا کنن. private_var و private_method به عنوان ویژگی و روش خصوصی تعریف شدن و باید خارج از کلاس استفاده نشن. protected_var و protected_method به عنوان ویژگی و روش محافظت شده در نظر گرفته میشن ولی به صورت مستقیم از خارج از کلاس قابل دسترسی نیستن و برای دسترسی به اونها از نامگذاری خاصی استفاده میشه.
مهم که توجه داشته باشید که استفاده از انکپسولیشن تو پایتون به عنوان یک توافق بین برنامهنویسان تلقی میشه و محدودیتهای مربوط به دسترسی به ویژگیها و روشها به طور مستقیم توسط زبان پایتون اعمال نمیشن.
رابطها (Interfaces) و OPP در پایتون
رابطها برای برنامه نویسی شی گرا در پایتون
خیلی مهمن. رابطها یه جور قرارداد بین کلاسها و شیها هستن. یعنی تو یه رابط تعدادی متد و خصیصه مشخص میکنی و هر کلاسی که میخواد این رابط رو پیادهسازی کنه، باید اون متدها و خصیصهها رو داشته باشه.
تو پایتون، رابطها رو با کلاسها تعریف میکنی که فقط امضای متدها و خصیصهها رو دارن و هیچ پیادهسازی واقعی ندارن. برا تعریف رابطها از کلمه کلیدی abc و ماژول ABC استفاده میکنی.
در پایتون، یه کلاس میتونه از چندین رابط استفاده کنه و تمام متدها و خصیصههای رابطها رو پیادهسازی کنه. اینجوری میتونی بگی که یه کلاس خاص میتونه همه چیزهای مورد نیاز رابط رو پشتیبانی کنه. استفاده از رابطها میتونه به کدت کمک کنه و رابطهای قویتری بین کلاسها برقرار کنی. همچنین، کدت رو قابل خوندنتر، قابل توسعهتر و قابل استفاده مجددتر میکنه.
مهمترین نکته اینه که تو پایتون رابطها به طور ضمنی استفاده میشن و نیازی به کلمه کلیدی implements مثل زبانهای دیگه نیست. پایتون با توجه به متدها و خصیصههایی که رابط نیاز داره، تشخیص میده که یه کلاس به عنوان رابط در نظر گرفته بشه یا نه.
با استفاده از رابطها میتونی کدت رو بهتر کنی و ارتباط قویتری بین کلاسها برقرار کنی. همچنین، استفاده از رابطها باعث میشه کدت قابل خوندنتر، قابل توسعهتر و قابل استفاده مجددتر بشه. البته باید بدونی که تو پایتون رابطها ساختاری هستن و اجباری برای پیادهسازیشون نیست. اما استفاده از رابطها خیلی توصیه میشه و میتونه ساختار کدت رو بهتر کنه.
ارتباطات بین شیها در پایتون
در پایتون، شیءها میتونن با یکدیگر تعامل کرده و اطلاعات روا تبادل کنن. این ارتباطات میتونه از طریق روابط مختلفی بین شیءها برقرار بشه. در زیر، چند روش رایج برای تعامل و تبادل اطلاعات بین شیءها در پایتون رو بررسی میکنیم:
- تعامل توسط متدها (Methods)
- تعامل توسط ویژگیها (Properties)
- تعامل توسط رویدادها (Events)
- تعامل توسط پارامترها (Parameters)
استفاده از شی گرایی در پروژههای پایتون
استفاده از برنامهنویسی شیءگرا در پروژههای بزرگ پایتون دارای مزایا و چالشهای خاصی هست. اینجا به برخی از این مزایا و چالشها اشاره میکنم:
مزایا:
- سازماندهی بهتر
- قابلیت استفاده مجدد
- مدیریت بهتر پیچیدگی
- ابسترهسازی
چالشها:
- پیچیدگی طراحی
- عملکرد
- پیچیدگی لایهبندی
چطوری میشه در پایتون سریعتر پیشرفت کرد؟
در نهایت
OOP در پایتونیه بخش خیلی مهمه. قسمت جالبش اینجاس که میتونی برنامهت رو به تکههای کوچیکتر تقسیم کنی که هر قسمت خودش مسئولیتشو داره و میتونه استفاده مجدد هم داشته باشه. اینجوری کدهات منظمتر و قابل فهمتر میشن و توسعه و تغییرشون آسونتر میشه.
شیءگرایی در پایتونخیلی امکانات خفنی داره، مثل سازماندهی بهتر کدها، قابلیت استفاده مجدد قطعههای کد، و مدیریت بهتر پیچیدگی. با توجه به این موارد، انتخاب استفاده از شیءگرایی در پروژههای پایتون باید با توجه به نیازها و شرایط خاصت باشه. ولی با استفاده درست، شیءگرایی میتونه به توسعه بهتر و بهرهوری بالاتر کمک کنه.
با خوندن مقالات مختلف ممکنه کمکم با بخشهای مختلف پایتون آشنا بشی. ولی حتما میدونی که اگه بیبرنامه و بیطرح باشی، احساس میکنی از زبان برنامهنویسی پایتون چیزی نمیفهمی یا حتی نتونی کامل یادش بگیری. ولی نگران نباش، تیم سبزلرن یه دوره عالی برای تو قرار داده میتونی از
صفر تا صد پایتونرو یاد بگیری. این دوره یه پشتیبانی آنلاین داره که هر وقت مشکل داشتی یا سوالی پیش اومد، متخصصین پایتون آماده جوابگویی و رفع اشکالات تو هستند. پس فرصت رو غنیمت بشمر و از همین الان یادگیری خودت رو شروع کن.
مقالات مرتبط
نظرات
اولین نفری باش که برای این مقاله نظر میدی.