آموزش

متغیرها در پایتون

📖 مقدمه

در برنامه‌نویسی شیءگرا با پایتون، دو نوع متغیر داریم:

نوع متغیرتوضیح
🏛️ متغیرهای کلاسی (Class Variables)متعلق به کلاس هستند و برای همه اشیاء (Instances) ساخته شده از آن کلاس مشترک هستند
🔧 متغیرهای نمونه (Instance Variables)متعلق به هر شیء به طور جداگانه هستند و هر شیء می‌تواند مقدار منحصر به فرد خود را داشته باشد

🟠 مثال پایه: تفاوت متغیر کلاسی و نمونه

python
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

۲. اولویت متغیر نمونه

⚠️ مهم: اگر متغیری با نام یکسان در سطح کلاس و سطح نمونه تعریف شود، متغیر نمونه اولویت دارد.

python
class Example:
    value = "متغیر کلاسی"  # متغیر کلاسی

    def __init__(self):
        self.value = "متغیر نمونه"  # متغیر نمونه با همان نام


obj = Example()

print(obj.value)        # متغیر نمونه (اولویت دارد)
print(Example.value)    # متغیر کلاسی

۳. تغییر متغیر کلاسی

روشتأثیر
✅ صحیح: Car.make = "Honda"تغییر برای همه اشیاء اعمال می‌شود
❌ نادرست: car1.make = "Honda"فقط یک متغیر نمونه جدید برای car1 ایجاد می‌کند
python
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

python
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 را دارد.


🟣 مثال پیشرفته: شمارنده اشیاء

python
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

🟤 مثال پیشرفته: تنظیمات پیش‌فرض

python
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. تعریف می‌شودویژگی‌های منحصر به فرد هر شیء

💡 خلاصه: متغیرهای کلاسی برای اشتراک‌گذاری داده بین همه اشیاء استفاده می‌شوند، در حالی که متغیرهای نمونه برای داده‌های مخصوص هر شیء هستند.

نمایش بیشتر

هادی محمدیان

هادی محمدیان | متخصص پایگاه داده، تحلیل داده و فرآیندهای سازمانی با تجربه عملی در طراحی و بهینه‌سازی زیرساخت‌های داده. در hadimohammadian.ir مفاهیم کاربردی مدیریت پایگاه داده، تحلیل داده، SQL، Python و اصول مهندسی داده را همراه با نگاه فرآیندمحور به زبان فارسی آموزش می‌دهم. هدف من پیوند دادن دانش فنی داده با نیازهای واقعی کسب‌وکار و کمک به سازمان‌ها برای تصمیم‌گیری داده‌محور است.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا