در درس قبل با کلاس (Class) و شیء (Object) آشنا شدیم. حالا میخواهیم یاد بگیریم هنگام ساخت یک Object چگونه اطلاعات مورد نیاز آن را به صورت خودکار تنظیم کنیم.
برای این کار در پایتون از متدی به نام __init__ استفاده میکنیم.
__init__ چیست؟
متد __init__ یکی از متدهای ویژه پایتون است که هنگام ایجاد یک Object اجرا میشود و معمولاً برای مقداردهی اولیه ویژگیهای Object استفاده میشود.
__init__
«سازنده» یا Constructor گفته میشود.
از نظر فنی، این متد وظیفه مقداردهی اولیه Object را بر عهده دارد.
چرا به __init__ نیاز داریم؟
فرض کنید میخواهیم برای هر دانشآموز نام و سن داشته باشیم.
بدون
__init__
مجبور هستیم بعد از ساخت Object، ویژگیهای آن را جداگانه تعیین کنیم.
class Student:
pass
student1 = Student()
student1.name = "Ali"
student1.age = 20
print(student1.name)
print(student1.age)
این روش امکانپذیر است، اما وقتی تعداد ویژگیها و Objectها زیاد شود، مدیریت اطلاعات سختتر خواهد شد.
با استفاده از
__init__
میتوانیم هنگام ساخت Object اطلاعات مورد نیاز را دریافت کنیم.
ساخت __init__
ساختار ساده یک
__init__
به شکل زیر است:
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
self چیست؟
کلمه self به Object فعلی اشاره میکند.
به زبان ساده، وقتی یک Object از کلاس ساخته میشود،
self
مشخص میکند ویژگیها و متدهای مربوط به کدام Object هستند.
self
یک قرارداد رایج در پایتون است و کلمه کلیدی مخصوص زبان نیست؛
اما بهتر است همیشه از همین نام استفاده کنیم.
یک مثال کامل با Student
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
student1 = Student("Ali", 20)
print(student1.name)
print(student1.age)
خروجی برنامه:
Ali 20
__init__ چگونه کار میکند؟
وقتی این دستور را اجرا میکنیم:
student1 = Student("Ali", 20)
پایتون Object جدیدی از کلاس
Student
ایجاد میکند و
__init__
را با اطلاعاتی که ارسال کردهایم اجرا میکند.
بنابراین:
nameمقدار Ali را دریافت میکند.ageمقدار 20 را دریافت میکند.self.nameویژگی نام Object را ایجاد میکند.self.ageویژگی سن Object را ایجاد میکند.
ساخت چند Object با اطلاعات متفاوت
یکی از مزیتهای مهم
__init__
این است که میتوانیم چند Object از یک کلاس بسازیم،
اما اطلاعات هر Object متفاوت باشد.
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
student1 = Student("Ali", 20)
student2 = Student("Sara", 19)
student3 = Student("Reza", 22)
print(student1.name)
print(student2.name)
print(student3.name)
خروجی:
Ali Sara Reza
مثال با کلاس Car
فرض کنیم میخواهیم یک کلاس برای خودرو بسازیم. هر خودرو میتواند برند و رنگ متفاوتی داشته باشد.
class Car:
def __init__(self, brand, color):
self.brand = brand
self.color = color
car1 = Car("Toyota", "White")
car2 = Car("BMW", "Black")
print(car1.brand)
print(car1.color)
print(car2.brand)
print(car2.color)
خروجی:
Toyota White BMW Black
تفاوت پارامتر و ویژگی Object
در این قسمت:
def __init__(self, name, age):
self.name = name
self.age = age
متغیرهای
name
و
age
پارامترهای متد هستند.
اما
self.name
و
self.age
ویژگیهای Object هستند.
مقدار
name
وارد متد میشود و سپس در
self.name
ذخیره میشود.
مقدار پیشفرض در __init__
میتوانیم برای بعضی پارامترها مقدار پیشفرض تعیین کنیم.
class Student:
def __init__(self, name, age=18):
self.name = name
self.age = age
student1 = Student("Ali")
print(student1.name)
print(student1.age)
چون برای
age
مقداری ارسال نکردهایم،
مقدار پیشفرض یعنی
18
استفاده میشود.
اگر آرگومان لازم را ارسال نکنیم چه میشود؟
اگر پارامتری مقدار پیشفرض نداشته باشد، هنگام ساخت Object باید مقدار آن را ارسال کنیم.
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
student1 = Student("Ali")
در این حالت پایتون خطای
TypeError
ایجاد میکند، چون مقدار
age
ارسال نشده است.
یک مثال واقعیتر
فرض کنید میخواهیم اطلاعات یک محصول را ذخیره کنیم:
class Product:
def __init__(self, name, price):
self.name = name
self.price = price
product1 = Product("Laptop", 50000000)
product2 = Product("Mouse", 800000)
print(product1.name)
print(product1.price)
print(product2.name)
print(product2.price)
در این مثال هر Object محصول، اطلاعات مخصوص خودش را دارد.
چرا __init__ مهم است؟
- اطلاعات Object را هنگام ایجاد آن مشخص میکنیم.
- کد مرتبتر و قابل فهمتر میشود.
- ساخت چند Object با اطلاعات متفاوت ساده میشود.
- ویژگیهای Object به صورت منظم تعریف میشوند.
- در پروژههای واقعی مدیریت دادهها راحتتر میشود.
تمرین
یک کلاس به نام
Book
ایجاد کنید که با استفاده از
__init__
سه ویژگی داشته باشد:
- عنوان کتاب:
title - نویسنده:
author - قیمت:
price
سپس دو Object با اطلاعات متفاوت ایجاد کنید و عنوان و قیمت هر دو کتاب را چاپ کنید.
جمعبندی
متد __init__ برای مقداردهی اولیه Object استفاده میشود.
با استفاده از self میتوانیم ویژگیهای مربوط به همان Object را تعریف کنیم.
به کمک
__init__
میتوانیم هنگام ساخت Object اطلاعات مورد نیاز آن را مشخص کنیم.
- __init__ چیست؟
- self چیست؟
- چگونه ویژگیهای Object را ایجاد کنیم؟
- چگونه چند Object با اطلاعات متفاوت بسازیم؟
- چگونه مقدار پیشفرض تعیین کنیم؟