آفلاین
user-avatar

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

2 سال پیش
توسط مهدی آپدیت شد
آفلاین
user-avatar
محمد ( 835 تجربه )
2 سال پیش

سلام
دوستان من موقع نوشتن کلاس های جدیدم مثل مدل زیر عمل میکنم که از مقدار 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)
بهترین پاسخ انتخاب شده توسط محمد
آفلاین
user-avatar
مهدی
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 استفاده میشه تابع نه شی نه نمونه رو دریافت نمیکنه

آفلاین
user-avatar
محمد ( 835 تجربه )
2 سال پیش

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

آفلاین
user-avatar
محمد ( 835 تجربه )
2 سال پیش

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

آفلاین
user-avatar
مهدی ( 23202 تجربه )
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 استفاده میشه تابع نه شی نه نمونه رو دریافت نمیکنه

برای ارسال پاسخ باید وارد سایت شوید