در مورد @classmethod و @staticmethod

پرسیده شده
فعالیت 976 روز پیش
دیده شده 518 بار
0

سلام و وقت بخیر 

من در مورد @staticmethod  و @classmethod مشکل دارم نمیدنم در این قسمت از برنامه کارشون چیه در مورد @abstractmethod میدونم کارش چی است ولی باقی رو نمیدونم توی گوگل هم سرچ کردم ولی میخوام از تجربه شما کمک بگیرم

 

فایل پیوست

محمدرضا مجیدی
محمدرضا مجیدی

29 مرداد 00

1
حذف شده

سلاااااااااااااااام محمدرضا جان

وقت شما هم بخیر

کار عجیب غریبی نمیکنن.

ما ۳ نوع متد تو کلاس میتونیم تعریف کنیم:

۱. متد ابجکت (عادی):

برای کار با یه ابجکت استفاده میشه. به وضعیت یه ابجکت دسترسی داره. هیچ دکوریتوری نداره. و وقتی از اون کلاس ابجکتی میسازیم. میتونیم از این نوع متد استفاده کنیم. همیشه وقت تعریف این نوع متد، آرگومان اول خود اون ابجکت هست که اکثرا اسمش رو self میذاریم. برای استفاده از این نوع متد حتما باید یه ابجکت از اون کلاس ساخته بشه. و معمولا تو این نوع متد یه کاری با ابجکت یا attribute هاش میکنیم.

۲. متد static:

معمولا برای تعریف utils های مربوط به کلاس و ابجکت ها استفاده میشه. به وضعیت کلاس و ابجکت ها دسترسی نداره. برای تعریف این نوع متد باید وقت تعریف متد با دکوریتور staticmethod بپوشونیمش. هیچ آرگومان خاصی مثل self یا cls وقت تعریف متد نداره. برای استفاده ازش لازم نیست حتما یه ابجکت اول ازش بذاریم. اغلب وقتی میخواهیم یه تابعی بنویسیم که مربوط به یه کلاس یا ابجکت هاش هست یا از لحاظ مفهمومی و منطقی به اون کلاس و ابجکت هاش مربوط هست. تابع مون رو به صورت staticmethod داخل اون کلاس خاص تعریف میکنیم. در واقع یه تابع معمولی هست که توی یه کلاس تعریف میشه و namespace اش رو میگیره.

۳. متد class:

برای کار با کلاس و ابجکت هاش استفاده میشه. به وضعیت کلاس دسترسی داره. به وضعیت ابجکت ها دسترسی نداره. برای تعریف این نوع متد باید وقت تعریف متد با دکوریتور classmethod بپوشونیمش. از اسمش مشخص هست که مربوط به کلاس هست. همیشه وقت تعریف متد اولین آرگومان خود اون کلاس هست که اکثرا اسمش رو cls میذاریم. برای استفاده ازش لازم نیست ابجکتی از کلاس بسازیم اول. معمولا کاری مربوط به کلاس یا ابجکت های کلاس انجام میده. مثل ابجکت فکتوری، ابجکت منیجمنت و غیره. بعضی وقتا هم میخواهیم یه staticmethod تعریف کنیم داخل کلاس و میخواهیم از متد ها یا attribute های دیگه اون کلاس استفاده کنیم. اینجور وقت ها هم معمولا متد رو به صورت classmethod تعریف میکنیم و از آرگومان اول کلاس متد یعنی cls داخل خود کلاس استفاده میکنیم مثلا برای صدا زدن متدهای دیگه اون کلاس یا کار با class attribute هاش.

 

امیدوارم کامل و واضح توضیح داده باشم. باز اگر سوالی داشتی در خدمتم :)

 

منبع:

https://realpython.com/instance-class-and-static-methods-demystified/

فایل پیوست

محمدعلی رضا

توسط

محمدعلی رضا

30 مرداد 00

0
حذف شده

سلام و درود آقا محممد 

مرسی آقت محمد بابت راهنماییتون و یک سوال دیگه هم داشتم راجب به decorator دکورتوری که استاد نوشته نمیدونم یکی چکار میکنه و راجبش میخواستم کاملتر بدونم راستی چرا اصلا  اینجا  obj  رو گرفت؟؟؟

فایل پیوست

محمدرضا مجیدی

توسط

محمدرضا مجیدی

31 مرداد 00

1
حذف شده

سلاااااااااااااااااام محمدرضا جان

اینکه این دکوریتور notify_observers چیکار میکنه از اسمش پیداست، قراره observer ها رو notify کنه. یعنی به observer ها اطلاع بده که این متد اجرا شد.

این دکوریتور اول متد رو اجرا میکنه، بعد به تمام observer های ابجکت، پیام از قبل تعیین شده (message) رو میفرسته. 

دکوریتور تمام آرگومان ها ترتیبی (args) و تمام آرگومان های کلید-مقداری (kwargs) تابع یا متدی که پوشونده (دکوریت کرده) رو میتونه بگیره و روشون عملیات انجام بده.

و اولین آرگومان متد checkout آرگومان self هست که یه آرگومان ترتیبی (args) هست و ما داخل دکوریتور گفتیم اولین آرگومان ترتیبی که به متد checkout داده میشه (همون self) رو اسمش رو obj بذار. و دیگه داخل داکوریتور به self با اسم obj دسترسی داریم.

 

امیدوارم برات شفاف شده باشه و به جواب سوالت رسیده باشی.

باز اگر سوالی داشتی در خدمتم :)

فایل پیوست

محمدعلی رضا

توسط

محمدعلی رضا

31 مرداد 00

0
حذف شده

سلام آقا محمد بله خیلی هم عالی مرسی از  راهنماییتون

 

فایل پیوست

محمدرضا مجیدی

توسط

محمدرضا مجیدی

31 مرداد 00