پایتون

جلسه ۳۷: متغیرهای کلاسی‌ و instance ای در پایتون

در این درس به دو نوع متغیر یعنی متغیرهای کلاسی و متغیرهای instace ای میپردازیم و یاد میگیریم که چگونه درست از آن ها استفاده کنیم.

در پایتون خصوصیات یک کلاس میتواند به دو صورت تعریف شود:

  • متغیرهای کلاسی
  • متغیرهای instance

تعاریف

متغیرهای کلاسی

متغیرهای کلاسی بین همه شی‌های آن کلاس مشترک است و بین آن ها به اشتراک گذاشته میشود. یک تغییر در متغیرهای کلاسی، این متغیر به عنوان خصوصیت برای همه اشیا نیز تغییر خواهد کرد.

متغیرهای instance

متغیرهای instance برای هر فراخوانی کلاس و شی منحصر به فرد است. یک تغییر در این نوع متغیر فقط برای آن شی‌ای که تغییر داده شده است، اعمال میگردد.

تعریف این متغیرهای کلاسی و instance

متغیرهای کلاسی خارج از آغازگر(__init__) و متغیرهای instance درون متد آغازگر تعریف می‌شوند.

class Player:
    teamName = 'Liverpool'  # class variables

    def __init__(self, name):
        self.name = name  # creating instance variables


p1 = Player('Mark')
p2 = Player('Steve')

print("Name:", p1.name)
print("Team Name:", p1.teamName)
print("Name:", p2.name)
print("Team Name:", p2.teamName)

در خط ۲ ما یک متغیر کلاسی تعریف کرده‌ایم و در خط ۵ یک متغیر instance.

استفاده غلط از متغیرهای کلاسی

ضروری است که اگر نیاز به متغیرهایی دارید که بین همه کلاس‌ها به اشتراک گذاشته شود، حتما از این متغیرهای کلاسی استفاده کنید، که در نتیجه اون میتوانید با تغییر آن، برای همه اشیا تغییر داده بشود. در مثال زیر یک کار اشتباه از استفاده متغیرهای کلاسی را می‌بینید:

class Player:
    formerTeams = []  # class variables
    teamName = 'Liverpool'
    def __init__(self, name):
        self.name = name  # creating instance variables


p1 = Player('Mark')
p2 = Player('Steve')

p1 = Player('Mark')
p1.formerTeams.append('Barcelona') # wrong use of class variable
p2 = Player('Steve')
p2.formerTeams.append('Chelsea') # wrong use of class variable

print("Name:", p1.name)
print("Team Name:", p1.teamName)
print(p1.formerTeams)
print("Name:", p2.name)
print("Team Name:", p2.teamName)
print(p2.formerTeams)

در مثال بالا، متغیر num برای هر شی‌ای از کلاس player یکتاست و همه اشیا به متغیر کلاسی formerTeams دسترسی دارند و میتوانند آن را برای همه آپدیت کنند.در این مثال برای همه اشیا، نام تیم یکسانی با استفاده از متغیر کلاسی در نظر گرفته‌ایم‌، چراکه مربوط به یک تیم مشخص هستند و برای همه ثابت و مشترک است. اما هر بازیکن ممکن است تیم‌سابق آن با بقیه بازیکنان متفاوت باشد . برای حل این مشکل ما از کد زیر استفاده میکنیم:

class Player:
    teamName = 'Liverpool'  # class variables

    def __init__(self, name):
        self.name = name  # creating instance variables
        self.formerTeams = []


p1 = Player('Mark')
p1.formerTeams.append('Barcelona')
p2 = Player('Steve')
p2.formerTeams.append('Chelsea')

print("Name:", p1.name)
print("Team Name:", p1.teamName)
print(p1.formerTeams)
print("Name:", p2.name)
print("Team Name:", p2.teamName)
print(p2.formerTeams)

اکنون خصوصیت FormerTeams برای هر شی از کلاس Player یکتا است و فقط توسط هر شی خودش قابل دسترسی است.

استفاده هوشمندانه از متغیرهای کلاسی

متغیرهای کلاسی در زمان‌هایی که باید خصوصیت‌هایی را تعریف کنیم که برای همه مشترک و یکسان باشد و البته همه به آن دسترسی داشته باشند استفاده میکنیم.یک مثال را ببینید:

class Player:
    teamName = 'Liverpool'      # class variables
    teamMembers = []

    def __init__(self, name):
        self.name = name        # creating instance variables
        self.formerTeams = []
        self.teamMembers.append(self.name)


p1 = Player('Mark')
p2 = Player('Steve')

print("Name:", p1.name)
print("Team Members:")
print(p1.teamMembers)
print("")
print("Name:", p2.name)
print("Team Members:")
print(p2.teamMembers)

توضیحات

  • در مثال بالا، ما متغیر کلاسی teamMember را تعریف کرده‌ایم که بین همه اشیا از کلاس Player به اشتراک گذاشته ‌شده است.
  • لیست teamMember، نام همه فراخوانی هایی که از این کلاس شده است را ذخیره میکند.
  • همانطور که در خط شماره ۸ میبینید، هربار که یک شی جدیدی ساخته میشود، نام آن به لیست teamMember اضافه میشود.
  • در خط ۱۶ و ۲۰ میبینید که متغیر teamMember توسط p1 و p2 فراخوانی شده است که هر دوی آن ها نتیجه یکسانی را برای ما خواهند داشت.

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

نوشته های مشابه

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

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

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