برنامه نویسی شی گرا در پایتون
برنامه نویسی شی گرا در پایتون
در این درس از مجموعه آموزش برنامه نویسی سایت سورس باران، با برنامه نویسی شی گرا در پایتون (object-oriented programming) و مفهوم کلی آن آشنا خواهید شد.
پیشنهاد ویژه : پکیج آموزش طراحی وب سایت با پایتون و جنگو
برنامه نویسی شی گرا
پایتون یک زبان برنامه نویسی چند پارادایمی است. از رویکردهای مختلف برنامه نویسی پشتیبانی می کند.
یکی از روشهای محبوب برای حل یک مشکل برنامه نویسی ، ایجاد اشیا است. این به عنوان برنامه نویسی شی گرا (OOP) شناخته می شود.
یک شی دو ویژگی دارد:
- ویژگی
- رفتار
بیایید مثالی بزنیم:
یک طوطی می تواند یک شی باشد ، زیرا دارای ویژگی های زیر است:
- نام، سن، رنگ به عنوان ویژگی
- آواز، رقص به عنوان رفتار
مفهوم OOP در پایتون بر ایجاد کد قابل استفاده مجدد متمرکز است. این مفهوم به DRY (تکرار نکنید) نیز معروف است.
در پایتون، مفهوم OOP از برخی اصول اساسی پیروی می کند:
کلاس
کلاس یک طرح اولیه برای آن شی است.
می توانیم کلاس را به عنوان طرحی از طوطی با برچسب در نظر بگیریم. این شامل تمام جزئیات مربوط به نام، رنگ، اندازه و غیره است. بر اساس این توصیفات، ما می توانیم در مورد طوطی مطالعه کنیم. در اینجا، یک طوطی یک شی است.
مثال برای کلاس طوطی
1 2 |
class Parrot: pass |
در اینجا، ما از کلید واژه class برای تعریف یک کلاس خالی Parrot استفاده می کنیم. از کلاس، ما نمونه ها را می سازیم. نمونه یک شی خاص است که از یک کلاس خاص ایجاد شده است.
شی در پایتون
یک شی (نمونه) نمونه ای از یک کلاس است. وقتی کلاس تعریف می شود، فقط توضیحات برای شی تعریف می شود. بنابراین، هیچ حافظه یا فضای ذخیره سازی اختصاص داده نمی شود.
مثال
1 |
obj = Parrot() |
در اینجا، obj یک شی کلاس Parrot است.
فرض کنید ما جزئیات Parrot ها را داریم. اکنون، ما می خواهیم نحوه ساخت کلاس و اشیای Parrot ها را نشان دهیم.
مثال 1: ایجاد کلاس و شی در پایتون
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
class Parrot: # class attribute species = "bird" # instance attribute def __init__(self, name, age): self.name = name self.age = age # instantiate the Parrot class blu = Parrot("Blu", 10) woo = Parrot("Woo", 15) # access the class attributes print("Blu is a {}".format(blu.__class__.species)) print("Woo is also a {}".format(woo.__class__.species)) # access the instance attributes print("{} is {} years old".format( blu.name, blu.age)) print("{} is {} years old".format( woo.name, woo.age)) |
خروجی
1 2 3 4 |
Blu is a bird Woo is also a bird Blu is 10 years old Woo is 15 years old |
در برنامه فوق یک کلاس با نام Parrot ایجاد کردیم. سپس، ویژگی ها را تعریف می کنیم. ویژگی ها مشخصه یک شی است.
این ویژگی ها در داخل روش __init__ کلاس تعریف می شوند. این روش مقداردهنده اولیه است که به محض ایجاد شی ابتدا اجرا می شود.
سپس، نمونه هایی از کلاس Parrot ایجاد می کنیم. در اینجا، blu و woo منابع (مقادیر) به اشیا جدید ما هستند.
با استفاده از __class _ می توانیم به ویژگی کلاس دسترسی پیدا کنیم. ویژگی های کلاس برای همه نمونه های یک کلاس یکسان است. به همین ترتیب، با استفاده از blu.name و blu.age به ویژگی های نمونه دسترسی پیدا می کنیم. با این حال، ویژگی های نمونه برای هر نمونه از یک کلاس متفاوت است.
روش ها (متدها)
متدها توابع تعریف شده در بدنه یک کلاس هستند. از آنها برای تعریف رفتارهای یک شی استفاده می شود.
مثال 2: ایجاد متد ها در پایتون
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
class Parrot: # instance attributes def __init__(self, name, age): self.name = name self.age = age # instance method def sing(self, song): return "{} sings {}".format(self.name, song) def dance(self): return "{} is now dancing".format(self.name) # instantiate the object blu = Parrot("Blu", 10) # call our instance methods print(blu.sing("'Happy'")) print(blu.dance()) |
خروجی
1 2 |
Blu sings 'Happy' Blu is now dancing |
در برنامه فوق، ما دو روش یعنی ()sing و ()dance را تعریف می کنیم. اینها متدهای نمونه (instance) نامیده می شوند زیرا آنها بر روی یک شی نمونه به عنوان مثال یعنی blu فراخوانی می شوند.
وراثت در برنامه نویسی پایتون
وراثت راهی برای ایجاد یک کلاس جدید برای استفاده از جزئیات یک کلاس موجود بدون تغییر در آن است. کلاس تازه تاسیس شده یک کلاس مشتق شده (یا کلاس کودک) است. به همین ترتیب، کلاس موجود یک کلاس پایه (یا کلاس والد) است.
مثال 3: استفاده از وراثت در پایتون
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
# parent class class Bird: def __init__(self): print("Bird is ready") def whoisThis(self): print("Bird") def swim(self): print("Swim faster") # child class class Penguin(Bird): def __init__(self): # call super() function super().__init__() print("Penguin is ready") def whoisThis(self): print("Penguin") def run(self): print("Run faster") peggy = Penguin() peggy.whoisThis() peggy.swim() peggy.run() |
خروجی
1 2 3 4 5 |
Bird is ready Penguin is ready Penguin Swim faster Run faster |
در برنامه فوق، ما دو کلاس یعنی Bird (کلاس والدین) و Penguin (کلاس کودک) ایجاد کردیم. کلاس کودک توابع کلاس والدین را به ارث می برد. این را می توانیم با متد ()swim دنبال کنیم.
دوباره، کلاس کودک رفتار کلاس والدین را اصلاح کرد. این را می توانیم با متد ()whoisThis دنبال کنیم. بعلاوه، ما با ایجاد یک متد ()run جدید، توابع کلاس والدین را گسترش می دهیم.
علاوه بر این، ما از تابع () super در داخل متد ()__init __ استفاده می کنیم. این به ما اجازه می دهد تا متد ()__init __ کلاس والدین را در داخل کلاس فرزند اجرا کنیم.
کپسوله سازی در پایتون
با استفاده از OOP در پایتون می توانیم دسترسی به متدها و متغیرها را محدود کنیم. این کار که از اصلاح مستقیم داده ها که کپسول سازی نامیده می شود، جلوگیری می کند. در پایتون، ما ویژگی های خصوصی را با استفاده از خط زیرین به عنوان پیشوند یگانه _ یا دوگانه __ نشان می دهیم.
مثال 4: کپسوله سازی داده ها در پایتون
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
class Computer: def __init__(self): self.__maxprice = 900 def sell(self): print("Selling Price: {}".format(self.__maxprice)) def setMaxPrice(self, price): self.__maxprice = price c = Computer() c.sell() # change the price c.__maxprice = 1000 c.sell() # using setter function c.setMaxPrice(1000) c.sell() |
خروجی
1 2 3 |
Selling Price: 900 Selling Price: 900 Selling Price: 1000 |
در برنامه فوق کلاس Computer را تعریف کردیم.
ما از متد ()__init __ برای ذخیره حداکثر قیمت فروش کامپیوتر استفاده کردیم. ما سعی کردیم قیمت را اصلاح کنیم. با این حال، ما نمی توانیم آن را تغییر دهیم زیرا پایتون با __maxprice به عنوان ویژگی های خصوصی رفتار می کند.
همانطور که نشان داده شده است، برای تغییر مقدار ما باید از یک تابع setter یعنی()setMaxPrice استفاده کنیم که قیمت را به عنوان یک پارامتر در نظر می گیرد.
پلی مورفیسم در پایتون
چندریختی یا چندشکلی یک توانایی در برنامه نویسی شی گرا است که با استفاده از رابط مشترک برای چندین فرم (انواع داده) است. در واقع یک کد نوشته شده در شرایط مختلف به شکل های مختلفی پاسخ بدهد.
فرض کنید، ما باید یک شکل را رنگ کنیم، چندین گزینه شکل (مستطیل ، مربع ، دایره) وجود دارد. با این حال می توانیم از همین روش برای رنگ آمیزی هر شکلی استفاده کنیم. این مفهوم چندریختی نام دارد.
مثال 5: استفاده از پلی مورفیسم در پایتون
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
class Parrot: def fly(self): print("Parrot can fly") def swim(self): print("Parrot can't swim") class Penguin: def fly(self): print("Penguin can't fly") def swim(self): print("Penguin can swim") # common interface def flying_test(bird): bird.fly() #instantiate objects blu = Parrot() peggy = Penguin() # passing the object flying_test(blu) flying_test(peggy) |
خروجی
1 2 |
Parrot can fly Penguin can't fly |
در برنامه فوق، ما دو کلاس Parrot و Penguin را تعریف کردیم. هر یک از آنها یک متد ()fly مشترک دارند. با این حال، عملکرد آنها متفاوت است.
برای استفاده از چند شکلی، ما یک رابط مشترک ایجاد کردیم به عنوان مثال تابع () flying_test که هر شی ای را می گیرد و متد ()fly شی را فراخوانی می کند. بنابراین، وقتی از اشیای blu و peggy در تابع flying_test() عبور کردیم، به طور موثر اجرا شد.
نکات کلیدی برای یادآوری:
- برنامه نویسی شی گرا درک و همچنین کارآیی برنامه را آسان می کند.
- تا آنجا که کلاس قابل اشتراک گذاری است، می توان از کد دوباره استفاده کرد.
- داده ها با انتزاع داده ها ایمن و مطمئن هستند.
- چند شکلی رابط یکسانی را برای اشیا مختلف فراهم می کند، بنابراین برنامه نویسان می توانند کدهای کارآمد بنویسند.
لیست جلسات قبل آموزش برنامه نویسی پایتون
- آموزش نصب و اجرای برنامه نویسی پایتون
- کلیدواژه ها و شناسه های برنامه نویسی پایتون
- دستورات، تورفتگی ها و کامنت ها در برنامه نویسی پایتون
- متغیرها، ثابت ها و لیترال ها در برنامه نویسی پایتون
- انواع داده ها در برنامه نویسی پایتون
- تبدیل نوع در برنامه نویسی پایتون
- ورودی، خروجی و وارد کردن در برنامه نویسی پایتون
- عملگرها در برنامه نویسی پایتون
- نام و دامنه در برنامه نویسی پایتون
- دستور شرطی if…else در برنامه نویسی پایتون
- حلقه for در برنامه نویسی پایتون
- حلقه while در برنامه نویسی پایتون
- دستورات break و continue در برنامه نویسی پایتون
- دستور pass در برنامه نویسی پایتون
- توابع در برنامه نویسی پایتون
- آرگومان تابع در برنامه نویسی پایتون
- تابع بازگشتی در برنامه نویسی پایتون
- تابع بی نام/ تابع لامبدا در برنامه نویسی پایتون
- متغیرهای سراسری، محلی و غیر محلی در برنامه نویسی پایتون
- کلیدواژه global در برنامه نویسی پایتون
- ماژول های برنامه نویسی پایتون
- پکیج ها در برنامه نویسی پایتون
- اعداد و تبدیل نوع داده در برنامه نویسی پایتون
- لیست در برنامه نویسی پایتون
- تاپل در برنامه نویسی پایتون
- رشته ها در برنامه نویسی پایتون
- مجموعه ها در برنامه نویسی پایتون
- دیکشنری در برنامه نویسی پایتون
- عملیات ورودی/خروجی در برنامه نویسی پایتون
- دایرکتوری و مدیریت فایل ها در برنامه نویسی پایتون
- خطاها و استثناهای توکار در برنامه نویسی پایتون
- مدیریت استثناها در برنامه نویسی پایتون
- استثناهای تعریف شده توسط کاربر در برنامه نویسی پایتون
دیدگاه شما