📖 مقدمه
در برنامهنویسی شیءگرا با پایتون، دو نوع متغیر داریم:
| نوع متغیر | توضیح |
|---|---|
| 🏛️ متغیرهای کلاسی (Class Variables) | متعلق به کلاس هستند و برای همه اشیاء (Instances) ساخته شده از آن کلاس مشترک هستند |
| 🔧 متغیرهای نمونه (Instance Variables) | متعلق به هر شیء به طور جداگانه هستند و هر شیء میتواند مقدار منحصر به فرد خود را داشته باشد |
🟠 مثال پایه: تفاوت متغیر کلاسی و نمونه
class Car: # متغیر کلاسی make = "Toyota" def __init__(self, model, year): # متغیرهای نمونه self.model = model self.year = year # ساخت اشیاء car1 = Car("Camry", 2023) car2 = Car("Corolla", 2022) # دسترسی به متغیر کلاسی (برای هر دو شیء یکسان است) print(car1.make) # Toyota print(car2.make) # Toyota # دسترسی به متغیر نمونه (برای هر شیء متفاوت است) print(car1.model) # Camry print(car2.model) # Corolla # تغییر متغیر نمونه (فقط روی car1 تأثیر میگذارد) car1.model = "RAV4" print(car1.model) # RAV4 print(car2.model) # Corolla
📋 جدول مقایسه: متغیر کلاسی vs متغیر نمونه
| ویژگی | متغیر کلاسی (Class Variable) | متغیر نمونه (Instance Variable) |
|---|---|---|
| 🏛️ مالکیت | متعلق به کلاس | متعلق به هر شیء |
| 🔄 اشتراک | بین همه اشیاء مشترک است | هر شیء مقدار مخصوص خود را دارد |
| 📝 تعریف | خارج از __init__ | داخل __init__ با self. |
| 🔍 دسترسی | با نام کلاس یا شیء | فقط با نام شیء |
| 💾 حافظه | یک نسخه برای کل کلاس | یک نسخه برای هر شیء |
🔑 نکات کلیدی
۱. نحوه دسترسی
| نوع متغیر | نحوه دسترسی | مثال |
|---|---|---|
| کلاسی | با نام کلاس و نقطه (.) | Car.make |
| نمونه | با نام شیء و نقطه (.) | car1.model |
۲. اولویت متغیر نمونه
⚠️ مهم: اگر متغیری با نام یکسان در سطح کلاس و سطح نمونه تعریف شود، متغیر نمونه اولویت دارد.
class Example: value = "متغیر کلاسی" # متغیر کلاسی def __init__(self): self.value = "متغیر نمونه" # متغیر نمونه با همان نام obj = Example() print(obj.value) # متغیر نمونه (اولویت دارد) print(Example.value) # متغیر کلاسی
۳. تغییر متغیر کلاسی
| روش | تأثیر |
|---|---|
✅ صحیح: Car.make = "Honda" | تغییر برای همه اشیاء اعمال میشود |
❌ نادرست: car1.make = "Honda" | فقط یک متغیر نمونه جدید برای car1 ایجاد میکند |
class Car: make = "Toyota" def __init__(self, model): self.model = model car1 = Car("Camry") car2 = Car("Corolla") # روش صحیح: تغییر متغیر کلاسی Car.make = "Honda" print(car1.make) # Honda print(car2.make) # Honda # روش نادرست: ایجاد متغیر نمونه جدید car1.make = "BMW" print(car1.make) # BMW (متغیر نمونه جدید) print(car2.make) # Honda (متغیر کلاسی تغییری نکرده) print(Car.make) # Honda
🟢 کاربردهای متغیرهای کلاسی
| # | کاربرد | توضیح |
|---|---|---|
| ۱ | 💾 ذخیره اطلاعات مشترک | اطلاعاتی که بین همه اشیاء یکسان است |
| ۲ | ⚙️ تعریف تنظیمات پیشفرض | مقادیر پیشفرض برای اشیاء |
| ۳ | 🔄 اشتراکگذاری دادهها | دادههایی که باید بین اشیاء به اشتراک گذاشته شوند |
| ۴ | 📊 شمارندهها | شمارش تعداد اشیاء ساخته شده |
🔵 مثال کاربردی: کلاس Animal
class Animal: # متغیر کلاسی species = "mammal" def __init__(self, name): self.name = name dog = Animal("Rex") cat = Animal("Whiskers") print(dog.species) # mammal print(cat.species) # mammal
💡 توضیح: در این مثال، متغیر
speciesبرای همه اشیاء کلاسAnimalمقدارmammalرا دارد.
🟣 مثال پیشرفته: شمارنده اشیاء
class Student: # متغیر کلاسی برای شمارش total_students = 0 def __init__(self, name): self.name = name # افزایش شمارنده با هر شیء جدید Student.total_students += 1 student1 = Student("Ali") student2 = Student("Sara") student3 = Student("Reza") print(f"تعداد کل دانشجویان: {Student.total_students}") # 3
🟤 مثال پیشرفته: تنظیمات پیشفرض
class DatabaseConnection: # تنظیمات پیشفرض مشترک host = "localhost" port = 5432 database = "myapp" def __init__(self, username): self.username = username def get_connection_string(self): return f"{self.username}@{self.host}:{self.port}/{self.database}" conn1 = DatabaseConnection("admin") conn2 = DatabaseConnection("user") print(conn1.get_connection_string()) # admin@localhost:5432/myapp print(conn2.get_connection_string()) # user@localhost:5432/myapp # تغییر تنظیمات برای همه اتصالها DatabaseConnection.host = "db.example.com" print(conn1.get_connection_string()) # admin@db.example.com:5432/myapp print(conn2.get_connection_string()) # user@db.example.com:5432/myapp
📊 جدول خلاصه قوانین
| قانون | مثال | نتیجه |
|---|---|---|
| دسترسی به متغیر کلاسی از طریق کلاس | Car.make | ✅ صحیح |
| دسترسی به متغیر کلاسی از طریق شیء | car1.make | ✅ صحیح (خواندن) |
| تغییر متغیر کلاسی از طریق کلاس | Car.make = "Honda" | ✅ برای همه اعمال میشود |
| تغییر متغیر کلاسی از طریق شیء | car1.make = "BMW" | ❌ متغیر نمونه جدید ایجاد میکند |
| اولویت متغیر نمونه بر کلاسی | self.value vs Class.value | نمونه برنده است |
⚠️ اشتباهات رایج
| # | اشتباه | توضیح | راهحل |
|---|---|---|---|
| ۱ | تغییر متغیر کلاسی با شیء | obj.var = value به جای Class.var = value | استفاده از نام کلاس |
| ۲ | تعریف متغیر کلاسی داخل __init__ | متغیرهای داخل __init__ نمونه هستند | تعریف خارج از __init__ |
| ۳ | فراموش کردن self. برای متغیر نمونه | بدون self. متغیر محلی است | استفاده از self.variable |
🟢 نتیجهگیری
| نوع متغیر | تعریف | کاربرد |
|---|---|---|
| 🏛️ متغیر کلاسی | خارج از __init__ تعریف میشود | اطلاعات مشترک، تنظیمات پیشفرض، شمارندهها |
| 🔧 متغیر نمونه | داخل __init__ با self. تعریف میشود | ویژگیهای منحصر به فرد هر شیء |
💡 خلاصه: متغیرهای کلاسی برای اشتراکگذاری داده بین همه اشیاء استفاده میشوند، در حالی که متغیرهای نمونه برای دادههای مخصوص هر شیء هستند.




