آموزش پایتون - سازنده

سازنده (constructor) در پایتون، یک متد نمونه در کلاس است که هر زمان شیء جدیدی از آن کلاس ایجاد شود، به‌صورت خودکار فراخوانی می‌شود. وظیفه سازنده این است که به‌محض تعریف شیء، به متغیرهای نمونه مقدار اختصاص دهد.

پایتون از یک متد ویژه به نام __init__() برای مقداردهی اولیه متغیرهای نمونه شیء استفاده می‌کند؛ این کار به‌محض تعریف شیء انجام می‌شود.

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

متد __init__() نقش سازنده را ایفا می‌کند. این متد به یک آرگومان اجباری به نام self نیاز دارد که مرجعی به خود شیء است.

def __init__(self, parameters):
#initialize instance variables

متد __init__()، مانند هر متد نمونه دیگری در یک کلاس، دارای یک پارامتر اجباری به نام self است. بااین‌حال، می‌توانید برای پارامتر اول هر نامی انتخاب کنید و الزامی نیست که حتماً self باشد.

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

پایتون دو نوع سازنده دارد:

  • سازنده پیش‌فرض
  • سازنده پارامتردار

سازنده پیش‌فرض در پایتون

به سازنده‌ای در پایتون که به‌جز self هیچ پارامتر دیگری نمی‌پذیرد، سازنده پیش‌فرض گفته می‌شود.

مثال

بیایید سازنده را در کلاس Employee تعریف کنیم تا نام و سن را به‌عنوان متغیرهای نمونه مقداردهی اولیه کند. سپس می‌توانیم از طریق شیء این کلاس به این ویژگی‌ها دسترسی داشته باشیم.

class Employee:
   'Common base class for all employees'
   def __init__(self):
      self.name = "Bhavana"
      self.age = 24

e1 = Employee()
print ("Name: {}".format(e1.name))
print ("age: {}".format(e1.age))

خروجی زیر تولید خواهد شد:

Name: Bhavana
age: 24

در کلاس Employee بالا، تمام اشیایی که تعریف می‌کنیم، برای متغیرهای نمونه name و age مقادیر یکسانی خواهند داشت. برای تعریف اشیایی با ویژگی‌های متفاوت به‌جای مقادیر پیش‌فرض، آرگومان‌هایی را برای متد __init__() تعریف کنید.

سازنده پارامتردار

اگر سازنده‌ای با چندین پارامتر، علاوه بر self، تعریف شود، به آن سازنده پارامتردار گفته می‌شود.

مثال

در این مثال، سازنده __init__() دارای دو آرگومان رسمی است. دو شیء از کلاس Employee را با مقادیر متفاوت تعریف می‌کنیم:

class Employee:
   'Common base class for all employees'
   def __init__(self, name, age):
      self.name = name
      self.age = age

e1 = Employee("Bhavana", 24)
e2 = Employee("Bharat", 25)

print ("Name: {}".format(e1.name))
print ("age: {}".format(e1.age))
print ("Name: {}".format(e2.name))
print ("age: {}".format(e2.age))

خروجی زیر تولید خواهد شد:

Name: Bhavana
age: 24
Name: Bharat
age: 25

همچنین می‌توانید برای آرگومان‌های رسمی در سازنده، مقادیر پیش‌فرض تعیین کنید تا بتوان اشیا را با ارسال پارامتر یا بدون ارسال آن ایجاد کرد.

class Employee:
   'Common base class for all employees'
   def __init__(self, name="Bhavana", age=24):
      self.name = name
      self.age = age

e1 = Employee()
e2 = Employee("Bharat", 25)

print ("Name: {}".format(e1.name))
print ("age: {}".format(e1.age))
print ("Name: {}".format(e2.name))
print ("age: {}".format(e2.age))

خروجی زیر تولید خواهد شد:

Name: Bhavana
age: 24
Name: Bharat
age: 25

پایتون: متدهای نمونه

علاوه بر سازنده __init__()، می‌توان یک یا چند متد نمونه دیگر نیز در یک کلاس تعریف کرد. به متدی که self یکی از آرگومان‌های رسمی آن است، متد نمونه گفته می‌شود؛ زیرا یک شیء مشخص آن را فراخوانی می‌کند.

مثال

در مثال زیر، متد displayEmployee() به‌عنوان یک متد نمونه تعریف شده است. این متد ویژگی‌های name و age شیء Employee را که آن را فراخوانی می‌کند، نمایش می‌دهد.

class Employee:
   def __init__(self, name="Bhavana", age=24):
      self.name = name
      self.age = age
   def displayEmployee(self):
      print ("Name : ", self.name, ", age: ", self.age)

e1 = Employee()
e2 = Employee("Bharat", 25)

e1.displayEmployee()
e2.displayEmployee()

خروجی زیر تولید خواهد شد:

Name : Bhavana , age: 24
Name : Bharat , age: 25

در هر زمانی می‌توانید ویژگی‌های کلاس‌ها و اشیا را اضافه، حذف یا ویرایش کنید:

# Add a 'salary' attribute
emp1.salary = 7000 
# Modify 'name' attribute
emp1.name = 'xyz' 
# Delete 'salary' attribute
del emp1.salary 

به‌جای استفاده از دستورهای معمول برای دسترسی به ویژگی‌ها، می‌توانید از توابع زیر استفاده کنید:

  • تابع getattr(obj, name[, default]) برای دسترسی به ویژگی یک شیء استفاده می‌شود.

  • تابع hasattr(obj,name) بررسی می‌کند که آیا یک ویژگی وجود دارد یا خیر.

  • تابع setattr(obj,name,value) برای مقداردهی به یک ویژگی استفاده می‌شود. اگر ویژگی وجود نداشته باشد، ایجاد خواهد شد.

  • تابع delattr(obj, name) برای حذف یک ویژگی استفاده می‌شود.

# Returns true if 'salary' attribute exists
print (hasattr(e1, 'salary')) 
# Returns value of 'name' attribute
print (getattr(e1, 'name')) 
# Set attribute 'salary' at 8
setattr(e1, 'salary', 7000) 
# Delete attribute 'age'
delattr(e1, 'age') 

خروجی زیر تولید خواهد شد:

False
Bhavana

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

همان‌طور که پیش‌تر اشاره شد، برای ایجاد سازنده، متد __init__() را تعریف می‌کنیم. بااین‌حال، برخلاف زبان‌های برنامه‌نویسی دیگری مانند C++ و Java، پایتون از تعریف چند سازنده پشتیبانی نمی‌کند.

اگر تلاش کنید چند سازنده تعریف کنید، پایتون خطایی ایجاد نمی‌کند؛ اما فقط آخرین متد __init__() تعریف‌شده در کلاس را در نظر می‌گیرد. تعریف‌های قبلی این متد با آخرین تعریف جایگزین می‌شوند.

بااین‌حال، راهی برای دستیابی به عملکردی مشابه در پایتون وجود دارد. می‌توانیم سازنده را بر اساس نوع یا تعداد آرگومان‌های ارسال‌شده به متد __init__() به‌گونه‌ای طراحی کنیم که رفتار متفاوتی داشته باشد. این روش به یک متد سازنده واحد اجازه می‌دهد تا بر اساس آرگومان‌های دریافتی، حالت‌های مختلف مقداردهی اولیه را مدیریت کند.

مثال

مثال زیر نشان می‌دهد که چگونه می‌توان به عملکردی مشابه استفاده از چند سازنده دست یافت.

class Student:
   def __init__(self, *args):
      if len(args) == 1:
         self.name = args[0]

      elif len(args) == 2:
         self.name = args[0]
         self.age = args[1]

      elif len(args) == 3:
         self.name = args[0]
         self.age = args[1]
         self.gender = args[2]

st1 = Student("Shrey")
print("Name:", st1.name)
st2 = Student("Ram", 25)
print(f"Name: {st2.name} and Age: {st2.age}")
st3 = Student("Shyam", 26, "M")
print(f"Name: {st3.name}, Age: {st3.age} and Gender: {st3.gender}")

با اجرای کد بالا، خروجی زیر تولید خواهد شد:

Name: Shrey
Name: Ram and Age: 25
Name: Shyam, Age: 26 and Gender: M

پیشرفت مطالعه: وضعیت خوانده‌شدن این درس فقط در همین مرورگر ذخیره می‌شود؛ بدون نیاز به حساب کاربری.