آموزش پایتون - ویژگی‌های کلاس

ویژگی‌ها یا متغیرهای تعریف‌شده در داخل یک کلاس، ویژگی‌ها (Attributes) نامیده می‌شوند. یک ویژگی، اطلاعاتی درباره نوع داده‌ای که یک کلاس شامل آن است ارائه می‌دهد. دو نوع ویژگی در پایتون وجود دارد: ویژگی نمونه (instance attribute) و ویژگی کلاس (class attribute).

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

ویژگی‌های کلاس (متغیرها)

ویژگی‌های کلاس متغیرهایی هستند که به یک کلاس تعلق دارند و مقدار آن‌ها بین تمام نمونه‌های آن کلاس مشترک است. یک ویژگی کلاس برای هر نمونه از کلاس یکسان باقی می‌ماند.

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

دسترسی به ویژگی‌های کلاس

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

مثال

مثال زیر نحوه دسترسی به ویژگی‌های یک کلاس پایتون را نشان می‌دهد.

class Employee:
   name = "Bhavesh Aggarwal"
   age = "30"

# instance of the class
emp = Employee()
# accessing class attributes
print("Name of the Employee:", emp.name)
print("Age of the Employee:", emp.age)

خروجی

Name of the Employee: Bhavesh Aggarwal
Age of the Employee: 30

تغییر ویژگی‌های کلاس

برای تغییر مقدار یک ویژگی کلاس، کافی است با استفاده از نام کلاس به همراه علامت نقطه و نام ویژگی، مقدار جدیدی به آن اختصاص دهیم.

مثال

در مثال زیر، ما در حال مقداردهی اولیه یک متغیر کلاس به نام empCount در کلاس Employee هستیم. برای هر شیء تعریف‌شده، متد __init__() به طور خودکار فراخوانی می‌شود. این متد متغیرهای نمونه را مقداردهی اولیه کرده و همچنین empCount را یک واحد افزایش می‌دهد.

class Employee:
   # class attribute    
   empCount = 0
   def __init__(self, name, age):
      self.__name = name
      self.__age = age
      # modifying class attribute
      Employee.empCount += 1
      print ("Name:", self.__name, ", Age: ", self.__age)
      # accessing class attribute
      print ("Employee Count:", Employee.empCount)

e1 = Employee("Bhavana", 24)
print()
e2 = Employee("Rajesh", 26)

خروجی

ما دو شیء تعریف کرده‌ایم. هر بار، empCount یک واحد افزایش می‌یابد.

Name: Bhavana , Age:  24
Employee Count: 1

Name: Rajesh , Age:  26
Employee Count: 2

اهمیت ویژگی‌های کلاس

ویژگی‌های کلاس به دلایل زیر حائز اهمیت هستند:

  • آن‌ها برای تعریف آن دسته از ویژگی‌های یک کلاس استفاده می‌شوند که باید برای هر شیء از آن کلاس، مقدار یکسانی داشته باشند.
  • ویژگی‌های کلاس را می‌توان برای تنظیم مقادیر پیش‌فرض برای اشياء استفاده کرد.
  • این امر همچنین در ایجاد سینگلتون‌ها (Singletons) مفید است؛ اشیایی که تنها یک بار ساخته می‌شوند و در بخش‌های مختلف کد مورد استفاده قرار می‌گیرند.

ویژگی‌های پیش‌فرض (Built-In) کلاس

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

  • __dict__ − دیکشنری حاوی فضای نام (namespace) کلاس.

  • __doc__ − رشته مستندات (docstring) کلاس یا None در صورت تعریف نشدن.

  • __name__ − نام کلاس.

  • __module__ − نام ماژولی که کلاس در آن تعریف شده است. این ویژگی در حالت تعاملی برابر با "__main__" است.

  • __bases__ − یک تاپل (احتمالاً خالی) حاوی کلاس‌های پایه، به ترتیبی که در لیست کلاس‌های پایه آمده‌اند.

دسترسی به ویژگی‌های پیش‌فرض کلاس

برای دسترسی به ویژگی‌های پیش‌فرض کلاس در پایتون، از نام کلاس به همراه یک نقطه (.) و سپس نام ویژگی استفاده می‌کنیم.

مثال

برای کلاس 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)

print ("Employee.__doc__:", Employee.__doc__)
print ("Employee.__name__:", Employee.__name__)
print ("Employee.__module__:", Employee.__module__)
print ("Employee.__bases__:", Employee.__bases__)
print ("Employee.__dict__:", Employee.__dict__ )

خروجی

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

Employee.__doc__: None
Employee.__name__: Employee
Employee.__module__: __main__
Employee.__bases__: (<class 'object'>,)
Employee.__dict__: {'__module__': '__main__', '__init__': <function Employee.__init__ at 0x0000022F866B8B80>, 'displayEmployee': <function Employee.displayEmployee at 0x0000022F866B9760>, '__dict__': <attribute '__dict__' of 'Employee' objects>, '__weakref__': <attribute '__weakref__' of 'Employee' objects>, '__doc__': None}

ویژگی‌های نمونه (Instance Attributes)

همان‌طور که قبلاً اشاره شد، یک ویژگی نمونه در پایتون متغیری است که مخصوص یک شیء خاص از کلاس است. این ویژگی در داخل متد __init__() تعریف می‌شود.

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

مثال

در کد زیر، نحوه کارکرد ویژگی‌های نمونه را نشان می‌دهیم.

class Student:
   def __init__(self, name, grade):
      self.__name = name
      self.__grade = grade
      print ("Name:", self.__name, ", Grade:", self.__grade)

# Creating instances 
student1 = Student("Ram", "B")
student2 = Student("Shyam", "C")

خروجی

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

Name: Ram , Grade: B
Name: Shyam , Grade: C

مقایسه ویژگی‌های نمونه و ویژگی‌های کلاس

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

شماره ویژگی نمونه ویژگی کلاس
1 مستقیماً در داخل تابع __init__() تعریف می‌شود. در داخل کلاس اما خارج از تابع __init__() تعریف می‌شود.
2 دسترسی به ویژگی نمونه با استفاده از نام شیء به همراه علامت نقطه انجام می‌شود. ویژگی‌های کلاس هم از طریق نام کلاس و هم از طریق نام شیء قابل دسترسی هستند.
3 مقدار این ویژگی نمی‌تواند بین سایر اشیاء به اشتراک گذاشته شود. مقدار آن بین سایر اشیاء کلاس به اشتراک گذاشته می‌شود.
4 تغییرات اعمال‌شده روی ویژگی نمونه، فقط همان شیئی را که در آن تعریف شده تحت تاثیر قرار می‌دهد. تغییرات اعمال‌شده روی ویژگی کلاس، تمام اشیاء آن کلاس را تحت تاثیر قرار می‌دهد.

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