جزئیات آموزش
مدرس: سجاد رحمانی
آخرین ویرایش: ۲۰ مرداد ۱۳۹۸
دسته بندی:

کانال تلگرام

بنر تلگرامی

مفهوم self و تابع (متد) __init__ در پایتون (python) + مثال کاربردی

مفهوم self در پایتون (python) چیست؟! تابع __init__ چطور؟! این سوالاتی است که با یک مثال کاربردی و تمرین به طور کامل در این آموزش یاد خواهیم گرفت! فقط مهمترین موضوع اینه که با ما پیش بیاید و پیش‌نیازها رو رعایت کنید! یعنی مثلاً اگر می‌گیم پیش‌نیاز این آموزش، درس مربوط به کلاس (class) است، باید مراجعه کنید! چون سنگ بنای این مبحث اونه! ولی اگر می‌گید وِلِش کن بابا! یه چیزی واسه خودش گفت! باید بگم این احتمال که این مبحث رو نفهمید رو هم لطفاً بپذیریذ! اما اگر پیش‌نیازها رو رعایت کنید و با ما کامل پیش بیاید، اطمینان کامل داشته باشید، محاله یاد نگیرید!

مطالب پیش نیاز!

مرور مطلب زیر از نووون شب واجب تره! هشدار جدی میدم، فهم این جلسه در گرو مرور مطلب قبلی است! خواهش می‌کنم از این هشدار سرسری عبور نکنید!

شی گرایی- آموزش اشیاء و کلاس ها در پایتون (Python)

مثال طلایی!

فرض کنید قراره کلاسی درست کنیم به اسم koolac! (یه اسم دلبخواه است! و ما به علت تعصب روی کولاک، همچین اسمی رو انتخاب کردیم!!)

هر شی (object) این کلاس، دو تا ویژگی داره! یکی x و یکی دیگه y! (که این طول و عرض نقطه است! یعنی همون x و y نقطه!)

حالا این کلاس، دو تا متد داره!

متد اولش میاد نقطه رو میندازه توی معادله ax+b !

متد دومش میاد نقطه رو میندازه توی معادله درجه دوم ax^2+b !

و این همچین قابلیتی هم داره که خود کاربر x و y و a و b رو وارد کنه! قطعاً مثال جذابی خواهد شد! پس بریم باهم کدنویسی این رو شروع کنیم!

کد نویسی مثال طلایی!

قطعه کد زیر رو در نظر بگیرید تا باهم روووش صحبت کنیم!

در خط ۱ که گفتیم کلاسی به اسم koolac درست کن!

تابع یا متد خوف و خفنِ __init___ در پایتون (python)

در خط ۲، از تابع خوف و خفن __init__ استفاده کردیم! شوخی میکنم فقط قیافش خوف و خفنه! وگرنه خودش چیز خاصی نیست! اولاً بدونید این تابع، به طور پیش‌فرض در پایتون تعریف شده! یعنی این اسمی نبوده که ما خودمون انتخاب کنیم! این متدی است که خود python برای کلاس ها داره!

حالا این تابع چیکار میکنه؟!

هیچی! کارش اینه که وقتی یک شی جدید از کارخونه میاد بیرون! [اگه یادتون باشه، این تعبیری بود که در آموزش جلسه پیش داشتیم!] میره سراغش! و سوال پیچش میکنه و ازش اطلاعات میگیره!

مثلاً در این مثال ما، به محض اینکه شی یا object از کارخونه میاد بیرون! میره میگه سلام self ! لطفاً بگو X اِت چیست؟! Y اِت چیست؟!

شاید بگید چرا گفت: «سلام self»؟! مگر هر شی یک اسم نداره؟! چرا اسمش رو صدا نزد! چون این بنده خدا اگر قرار باشه اسم همه رو بدونه و حفظ کنه که پیر میشه که!!! [این جنبه شوخیش!]

جمله قصار به سبک پایتون (python): اما در حالت کلی وقتی توی این کارخونه بخوان بگن: شی فلان (یا شی نوعی!) میگن self !

شاید به جرأت بتونم بگم مفهوم self همین بود! و از اینجا به بعد توی مثال ها و خط های بعدی این کد، توضیح بیشتر میدیم تا همین جمله بهتر فهمیده بشه! ولی جمله قصار بالا مفهوم کلی self است!

و آخرین مورد در مورد __init__ اینکه init مخفف initialize است! که برای مقداردهی اولیه و کارهای اولیه بعد از ایجاد شی بکار میره!

بریم سراغ توضیح ادامه کد خودمون!

پس در خط ۲، به محض ایجاد هر شی یا object، جناب آقایِ __init___ میره سراغ شیِ فلان (self) و میگه X و Y حضرت عالی چیست! و بعد که X و Y اون شی فلان (self) رو پرسید!

میاد یک ویژگی براش تعریف میکنه به اسم x (حرف کوچیک نوشتم! به این توجه کنید!) و یک ویژگی دیگه به اسم y (این هم حرف کوچیکه!)

پس در خط ۳ میگه: این شیِ فلان (self) یه ویژگی به اسم x داره که برابر است با هموون X که موقع پرسیدن ازش گرفتیم! [توجه کنید که این اسامی اختیاری اند! یعنی می‌شد بجای x نوشت Sajjad! ولی خب چون نوشتن همچین اسمی نامأنوس بود، ما از این کارها نکردیم!]

در خط ۴ هم میگیم: واسه همون شیِ فلان (self) ویژگی به اسم y تعریف کن که برابر است با همون Y که موقع پرسیدن ازش گرفتیم!

این بود تمام اطلاعات اولیه که آقای __init__ لطف کرد و گرفت!

حالا در ادامه دو تا تابع داریم تعریف می‌کنیم!

تابع یا متد اول به اسم fit_daraje_1  که میاد اون معادله درجه اول ax+b رو برازش میده! (fit میکنه!) [به زبووون خودمون: یعنی همون نقاط رو میندازه توی همچین معادله‌ای!]

تابع یا متد دوم با اسم fit_daraje_2 میاد تابع درجه دوم ax^2+b رو fit میکنه! (برازش میده به x و y)!

توضیح تابع یا متد fit_daraje_1

در خط ۵ و ۶ این تابع رو تعریف کردیم! این تابع دوتا ورودی هم از کاربر میگیره! به اسم a و b ! (که ضرایب همون معادلات است!)

و میاد چاپ میکنه: مقدار ax+b رو! همین! (که a و b رو که همین الان از کاربر گرفت! x رو هم موقع ایجاد شی، آقای __init__ زحمتش رو کشید!)

و توجه کنید که ننوشتیم x نوشتیم، self.x ! چون اگه بگیم x، سوال پیش میاد که x چه کسی؟! کدوووم شی؟! پس باید بگیم self.x که بگیم x اوون شیِ فلان! که حالا بعداً می‌بینید که چجوری اون شی رو بهش می‌فهمووونیم!

توضیح تابع یا متد fit_daraje_2

این تابع رو در خط ۷و ۸ تعریفش کردیم!

این هم دوتا ورودی میگیره و معادله ax^2+b رو میسازه! و مشابه تابع اول، مقدارش رو چاپ میکنه!

 

خب تا اینجا کلاس رو تعریف کردیم! یه چیزی هم که یه عده میگن رو هم این پاییین می‌نویسم:!

هر تابع (متد) در کلاس (class) مولفه اولش self است!

حالا بریم سراغ پیاده سازی این کلاس!

پیاده سازی و ساخت شی از کلاس!

خط ۹: حالا قراره یک شی از این کارخونه درست کنیم به اسم model ! (اسم من Sajjad است! اسم ایشون model ! هرکسی یه اسمی داره دیگه! ولی اسمش هم دلبخواهه! میتونستم اسمش رو Sajjad هم بذارم! اصلاً به عنوان تمرین شما اسمش رو بذارید Sajjad !)

این model از کارخونه koolac با دو X و Y به ترتیب با مقدار ۲ و ۵ میره پیش آقای __init__ تا مقدارش رو ثبت کنه! پس الان x این شی ۲ و y این شی ۵ است!

در خط ۱۰، میگیم از همین شی با نام model بیا متد fit_daraje_1 رو فراخوانی کن و به a و b ای که این متد لازم داره مقدارهای ۱ و ۱ رو بده!

پس این تابع میاد مقدار زیر رو چاپ میکنه!

a*x+b=1*(2)+1=3

حالا در خط ۱۱، میایم از شیِ model متد fit_daraje_2 رو فراخوانی میکنیم! و اون a و b رو هم ۱ و ۱ میدیم! پس مقدار زیر رو چاپ خواهد کرد!

a*x^2+b=1*(2)^2+1=5

اگر این کد رو اجرا کنید، می‌بینید که واقعاً همین مقادیر ۳ و ۵ رو نشون میده!

این مبحث از پایتون (python) واقعاً آسوون نبود! ولی سعی کردم به بهترین شکل آموزشش بدم، اگر سوالی داشتید، بازهم در خدمتیم!