خب اول راجع به __init__ :
در هر کلاسی یک تابعی به نام __init__ تعریف میشه که سازنده یا constructor اون کلاس هست.خب این یعنی چی؟ این یعنی اینکه موقعی که یک شی از اون کلاس میسازید مقادیر و آرگومانهای اولیه اش رو تعریف میکنید و self هم (عین this تو جاوا) به مقادیری درون کلاس اشاره میکنه.
یکخورده نامفهوم بود بزار با مثال بگم.
فرض کن میخوایم یک کلاسی بسازیم که دوتا عدد رو باه جمع کنه و مجموعشون رو بهمون بده.یک کلاس میسازیم به اسم sum :
class sum:
خب مقادیر پیش فرض رو به کلاس با تعریف تابع __init__مشخص میکنیم :
class sum:
def __init__(self,a,b):
self.a = a
self.b = b
خب از کلاسی که ساختیم یک نمونه شی میسازیم که بقیه ی توضیحات رو عارض بشم :
x = sum(5,10)
الان یک شی ساختیم به اسم x از کلاس sum که دوتا مقدار بهش دادیم که اولی تو a و دومی تو b قرار میگیره و self هم تو تعریف کلاس نادیده گرفته میشه و فقط آرگومانی ضروری برای داخل کلاسه و آرگومانهای بعدی از تابع __init__ آرگومانهایی هستند که موقع تریف اولیه تابع مقدار دهی میشند مثل مثالی که گفتم.
حالا یک متد دیگه تو کلاس میسازیم به اسم printSum که جمع دو تا مقداری رو که موقع تعریف کلاس داده بودیم رو روی صفحه چاپ کنه :
class sum:
def __init__(self,a,b):
self.a = a
self.b = b
def printSum(self):
self.sum = self.a + self.b
print(self.sum)
یک نگاهی به تابع بالا بنداز، همیشه آرگومان اول self هست و مادامیکه اون شی زندست (مثلا شی x تو اینجا) مقادیر self ذخیره شدن توش و با فراخوانی هر متد از اون کلاس همچنان قابل فراخانی اند.
حالا از متد بالا تو شی x استفاده میکنیم :
x.printSum()
و متد پرینت سام اجرا میشه و مقادیری که موقع تعریف شی به کلاس داده بودیم حالا جمعشون رو فراخوانی و چاپ کردیم..
اینم کد کل برنامه ای که نوشتیم :
class sum:
def __init__(self,a,b):
self.a = a
self.b = b
def printSum(self):
self.sum = self.a + self.b
print(self.sum)
x = sum(5,10)
x.printSum()