من در مورد @staticmethod و @classmethod مشکل دارم نمیدنم در این قسمت از برنامه کارشون چیه در مورد @abstractmethod میدونم کارش چی است ولی باقی رو نمیدونم توی گوگل هم سرچ کردم ولی میخوام از تجربه شما کمک بگیرم
سلاااااااااااااااام محمدرضا جان
وقت شما هم بخیر
کار عجیب غریبی نمیکنن.
ما ۳ نوع متد تو کلاس میتونیم تعریف کنیم:
۱. متد ابجکت (عادی):
برای کار با یه ابجکت استفاده میشه. به وضعیت یه ابجکت دسترسی داره. هیچ دکوریتوری نداره. و وقتی از اون کلاس ابجکتی میسازیم. میتونیم از این نوع متد استفاده کنیم. همیشه وقت تعریف این نوع متد، آرگومان اول خود اون ابجکت هست که اکثرا اسمش رو self میذاریم. برای استفاده از این نوع متد حتما باید یه ابجکت از اون کلاس ساخته بشه. و معمولا تو این نوع متد یه کاری با ابجکت یا attribute هاش میکنیم.
۲. متد static:
معمولا برای تعریف utilsهای مربوط به کلاس و ابجکتها استفاده میشه. به وضعیت کلاس و ابجکتها دسترسی نداره. برای تعریف این نوع متد باید وقت تعریف متد با دکوریتور staticmethod بپوشونیمش. هیچ آرگومان خاصی مثل self یا cls وقت تعریف متد نداره. برای استفاده ازش لازم نیست حتما یه ابجکت اول ازش بذاریم. اغلب وقتی میخواهیم یه تابعی بنویسیم که مربوط به یه کلاس یا ابجکت هاش هست یا از لحاظ مفهمومی و منطقی به اون کلاس و ابجکت هاش مربوط هست. تابع مون رو به صورت staticmethod داخل اون کلاس خاص تعریف میکنیم. در واقع یه تابع معمولی هست که توی یه کلاس تعریف میشه و namespace اش رو میگیره.
۳. متد class:
برای کار با کلاس و ابجکت هاش استفاده میشه. به وضعیت کلاس دسترسی داره. به وضعیت ابجکتها دسترسی نداره. برای تعریف این نوع متد باید وقت تعریف متد با دکوریتور classmethod بپوشونیمش. از اسمش مشخص هست که مربوط به کلاس هست. همیشه وقت تعریف متد اولین آرگومان خود اون کلاس هست که اکثرا اسمش رو cls میذاریم. برای استفاده ازش لازم نیست ابجکتی از کلاس بسازیم اول. معمولا کاری مربوط به کلاس یا ابجکتهای کلاس انجام میده. مثل ابجکت فکتوری، ابجکت منیجمنت و غیره. بعضی وقتا هم میخواهیم یه staticmethod تعریف کنیم داخل کلاس و میخواهیم از متدها یا attributeهای دیگه اون کلاس استفاده کنیم. اینجور وقتها هم معمولا متد رو به صورت classmethod تعریف میکنیم و از آرگومان اول کلاس متد یعنی cls داخل خود کلاس استفاده میکنیم مثلا برای صدا زدن متدهای دیگه اون کلاس یا کار با class attribute هاش.
امیدوارم کامل و واضح توضیح داده باشم. باز اگر سوالی داشتی در خدمتم :)
مرسی آقت محمد بابت راهنماییتون و یک سوال دیگه هم داشتم راجب به decorator دکورتوری که استاد نوشته نمیدونم یکی چکار میکنه و راجبش میخواستم کاملتر بدونم راستی چرا اصلا اینجا obj رو گرفت؟؟؟
محمدرضا مجیدی۳۱ مرداد ۱۴۰۰، ۰۱:۲۳
سلاااااااااااااااااام محمدرضا جان
اینکه این دکوریتور notify_observers چیکار میکنه از اسمش پیداست، قراره observerها رو notify کنه. یعنی به observerها اطلاع بده که این متد اجرا شد.
این دکوریتور اول متد رو اجرا میکنه، بعد به تمام observerهای ابجکت، پیام از قبل تعیین شده (message) رو میفرسته.
دکوریتور تمام آرگومانها ترتیبی (args) و تمام آرگومانهای کلید-مقداری (kwargs) تابع یا متدی که پوشونده (دکوریت کرده) رو میتونه بگیره و روشون عملیات انجام بده.
و اولین آرگومان متد checkout آرگومان self هست که یه آرگومان ترتیبی (args) هست و ما داخل دکوریتور گفتیم اولین آرگومان ترتیبی که به متد checkout داده میشه (همون self) رو اسمش رو obj بذار. و دیگه داخل داکوریتور به self با اسم obj دسترسی داریم.
امیدوارم برات شفاف شده باشه و به جواب سوالت رسیده باشی.
باز اگر سوالی داشتی در خدمتم :)
محمدعلی رضا۳۱ مرداد ۱۴۰۰، ۱۰:۵۰
سلام آقا محمد بله خیلی هم عالی مرسی از راهنماییتون