class Date:
def __init__(self, y, m, d):
self.y, self.m, self.d = y, m, d
@classmethod
def from_string(cls, text):
y, m, d = map(int, text.split("-"))
return cls(y, m, d) # cls یعنی «همین کلاسی که صدا زده شد»
@staticmethod
def is_leap(year):
return year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)
چرا from_string را classmethod کردیم؟ چون اگر زیرکلاسی آن را صدا بزند، cls همان زیرکلاس است و شیء درست ساخته میشود — چندریختیِ سطح کلاس. با staticmethod این خاصیت را از دست میدادی. staticmethod فقط برای «تابعِ بیطرفی که منطقاً مال این کلاس است» (مثل is_leap) به کار میرود.