با سلام در ادامه مقاله قبلی که در مورد همین موضوع (برنامه نویسی شئ گرا در پایتون) بود در رابطه با ساخت کلاس - ساخت متد و متد سازنده حرف زدیم - (مقاله قبلی)
در این مقاله با class variable ، instance variable همچنین استاتیک متد و کلاس متد آشنا خواهیم شد.
متغیرهای کلاس و متغییر های شئ(object) معمولا با هم استفاده میشوند!
اما تفاوت اصلی چیه؟
تمامی نمونه(instance) های ساخته شده از کلاس به صورت پیشفرض متغییرهای کلاسی رو دارند.
در صورت تغییر متغییر کلاسی تمامی متغییر ها در اشیا ساخته شده نیز تغییر میکند.
نکته: این اتفاق وقتی که مقدار این متغیر را از شئ تغییر بدهیم رخ نمیدهد
متغیر های سطح آبجکت(instance variable) رو هم باهاش آشناییت دارید(self.some = 2)
یه نقل و قول از لینوس توروالدز هست که میگه: " Talk is cheap, Show me the code "
پس میریم سر اصل مطلب:
class Person: age = 30 # Class Variable def __init__(self,name): self.name = name # instance varibale p1 = Person('mohammad') print(p1.age) # 30 p2 = Person('ali') print(p2.age) # 30 Person.age = 25 print(p1.age) # 25 print(p2.age) # 25 p2.age = 27 print(p2.age) # 27 print(p1.age) # 25 Person.age = 20 print(p1.age) # 20 print(p2.age) # 27
خب همونطور که میبینید همه شئ های ساخته شده از کلاس Person دارای attribute خود کلاس به نام age هستند و با تغییر این attribute این مقدار در تمامی شئ ها تغییر میکند مگر اینکه در یکی از این اشیا ساخته شده مقدار جدیدی به آن تخصیص داده شود.
برخلاف instance method ها که به عنوان اولین پارامتر ورودی آبجکت را میگیرند کلاس متد ها به عنوان پارامتر اول ورودی خود کلاس را میگیرند.
برای تعریف یک کلاس متد میتوانیم از دکوراتور classmethod استفاده کنیم. به مثال زیر توجه کنید.
class Person: state = '' @classmethod def change_state(cls, new_state): cls.state = new_state
برای استفاده از کلاس متد ها نیازی به ساخت آبجکت از کلاس نیست و میتوان مستقیما آن را با استفاده از خود کلاس صدا کرد همچنین از نمونه ساخته شده نیز میتوان استفاده کرد.
استاتیک متد ها پارامتر های self, cls را نمیگیرند و عملیاتی که انجام میدهند محدود به اطلاعات ورودی آن هاست برای استفاده از این متد ها نیاز به ساخت ابجکت یک کلاس نیست. با استفاده از دکوراتور staticmethod تعریف میشود به مثال زیر توجه کنید.
class Math: @staticmethod def is_pass(score): if score >= 12: return True return False
ما میتوانیم با استفاده از کلاس به این متد دسترسی داشته باشیم و هیچ تغییری در کلاس یا ابجکت ساخته شده ایجاد نمیکنیم.