محمد
6 سال پیش توسط محمد مطرح شد
3 پاسخ

تفاوت شی های staticmethod با classmethod

سلام
دوستان من موقع نوشتن کلاس های جدیدم مثل مدل زیر عمل میکنم که از مقدار self دیگه نیازی نیست استفاده کنم ولی راستش فقط میدونم این مدلی درسته ولی نمیدونم چرا و فرقشون با هم چیه؟

class reg_new_user:
    @staticmethod
    def insert_to_database(name,username,password,email,mobile):
        userdata = {"name":name,"username":username,"password":password,"email":email,"mobile":mobile}
        print(userdata)

ثبت پرسش جدید
مهدی
@code2code 6 سال پیش آپدیت شد
2

مثال زیر رو ببین:

class MyClass:
    def method(self):
        return 'instance method called', self

    @classmethod
    def cm(cls):
        return 'class method called', cls

    @staticmethod
    def sm():
        return 'static method called'

obj = MyClass()
print(1, obj.method())
print(2, MyClass.method(obj))
print(3,obj.cm())
print(4, MyClass.cm())
print(5, obj.sm())
print(6, MyClass.sm())
print(7, MyClass.method())

در حالت عادی ورودی تابع یک نمونه از کلاسه که در واقع باید یه نمونه رو دریافت کنه و میتونه کارایی رو با self انجام بده(در واقع در مثال بالا نتیجه هر پرینت 1 2یه چیزه)
در حالتی که از classmethod decorator استفاده میشه تابع به جای نمونه خود کلاس رو دریافت میکنه و میتونه تغییرات و کارایی مستقیما رو کلاس انجام بده
در حالتی که از staticmethod decorator استفاده میشه تابع نه شی نه نمونه رو دریافت نمیکنه


محمد
@ranger.m.gh 6 سال پیش مطرح شد
0

من داکیومنتش رو پیدا کردم ولی نمیفهمم داستان چیه
http://docs.python.org/library/functions.html#staticmethod
http://docs.python.org/library/functions.html#classmethod
میشه یه نفر از اساتید ساده بگه داستان چیه؟


محمد
@ranger.m.gh 6 سال پیش مطرح شد
0

کسی نیست من رو هم راهنمایی کنه؟ یا فقط اینجا متخصصین نود جی اس حال میکنن :(


مهدی
@code2code 6 سال پیش آپدیت شد
2

مثال زیر رو ببین:

class MyClass:
    def method(self):
        return 'instance method called', self

    @classmethod
    def cm(cls):
        return 'class method called', cls

    @staticmethod
    def sm():
        return 'static method called'

obj = MyClass()
print(1, obj.method())
print(2, MyClass.method(obj))
print(3,obj.cm())
print(4, MyClass.cm())
print(5, obj.sm())
print(6, MyClass.sm())
print(7, MyClass.method())

در حالت عادی ورودی تابع یک نمونه از کلاسه که در واقع باید یه نمونه رو دریافت کنه و میتونه کارایی رو با self انجام بده(در واقع در مثال بالا نتیجه هر پرینت 1 2یه چیزه)
در حالتی که از classmethod decorator استفاده میشه تابع به جای نمونه خود کلاس رو دریافت میکنه و میتونه تغییرات و کارایی مستقیما رو کلاس انجام بده
در حالتی که از staticmethod decorator استفاده میشه تابع نه شی نه نمونه رو دریافت نمیکنه


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام