سازنده __init__ در پایتون

آشنایی با __init__ و self برای مقداردهی اولیه اشیاء

در درس قبل با کلاس (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__ را با اطلاعاتی که ارسال کرده‌ایم اجرا می‌کند.

بنابراین:

ساخت چند 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__ مهم است؟

تمرین

یک کلاس به نام Book ایجاد کنید که با استفاده از __init__ سه ویژگی داشته باشد:

  • عنوان کتاب: title
  • نویسنده: author
  • قیمت: price

سپس دو Object با اطلاعات متفاوت ایجاد کنید و عنوان و قیمت هر دو کتاب را چاپ کنید.

جمع‌بندی

متد __init__ برای مقداردهی اولیه Object استفاده می‌شود.

با استفاده از self می‌توانیم ویژگی‌های مربوط به همان Object را تعریف کنیم.

به کمک __init__ می‌توانیم هنگام ساخت Object اطلاعات مورد نیاز آن را مشخص کنیم.

آنچه در این درس یاد گرفتیم:
  • __init__ چیست؟
  • self چیست؟
  • چگونه ویژگی‌های Object را ایجاد کنیم؟
  • چگونه چند Object با اطلاعات متفاوت بسازیم؟
  • چگونه مقدار پیش‌فرض تعیین کنیم؟