زبان python دارای سه نوع متد، شامل: Instance method, Class method و Static method است. متدهای یک کلاس به طور پیش فرض از نوع Instance method است و اگر بخواهیم تغییری در این روند ایجاد کنیم باید از decorator های مخصوص استفاده کنیم که در ادامه به شرح هرکدام می پردازیم .
رایج ترین و قدرتمندترین متدها در زبان پایتون هستند. این متدها از پارامتر self به عنوان اولین آرگومان در ورودی استفاده می کنند (بدیهی ست که استفاده از سایر ورودی ها امکان پذیر است). با استفاده از self که به Instance کلاس اشاره می کند، دسترسی به سایر متد ها و attributes های کلاس امکان پذیر است.
Syntax:
class C(object): def fun(self, arg1, arg2, ...): ....
برای استفاده از instance method ها باید یک نمونه از آن ایجاد کرد و از اعضای آن ها استفاده کرد:
c = C() c.fun("arg1", "arg2", ...)
متدهایی که به این صورت تعریف شوند، با هر بار ایجاد نمونه از کلاس می توانند نتایج متفاوت داشته باشند. این متد ها با استفاده از self.__class__
به اعضای کلاس دسترسی دارند، بنابراین قادرند وضعیت class و وضعیت instance ساخته شده از کلاس را تغییر دهند.
این نوع از متد با استفاده از دکوراتور داخلی (builtin) classmethod@ ایجاد (و شناخته) می شوند. یک کلاس متد پارامتر cls را به عنوان اولین آرگومان در ورودی می پذیرند (مثل حالت قبل استفاده از سایر ورودی ها نیز امکان پذیر است). cls به اشیای درون کلاس اشاره می کند و نه نمونه ساخته شده از آن، بنابراین Class method ها می توانند وضعیت کلاس را تغییر دهند.
Syntax:
class C(object): @classmethod def fun(cls, arg1, arg2, ...): ....
برای استفاده از کلاس متدها نیازی به ساخت نمونه از آن نیست و می توان از کلاس متدها به صورت زیر استفاده کرد:
c = C.func("arg1", "arg2")
کلاس متدها محدود به کلاس هستند و نه نمونه ساخته شده (Instance) از کلاس و می توانند state کلاس را از طریق پارامتر cls تغییر دهند که تغییر در کلاس منجر به تغییر state نمونه های ساخته شده از کلاس نیز خواهد شد.
عموما از کلاس متدها برای ایجاد factory method استفاده می شود. factory method همانند constructor ها یک نمونه از کلاس برای use case های مختلف برمی گردانند.
این متد ها با استفاده از دکوراتور staticmethod@ ایجاد (و شناخته) می شوند. در ورودی این نوع متد ها پارامتر معناداری مانند cls یا self وجود ندارد اما مانند تمام متد ها امکان دریافت ورودی را دارند.
این متدهای کاربرد زیادی در برنامه نویسی پایتون ندارند و به جای آن ها می توان از module functions (توابعی که در یک ماژول دیگر قرار دارد، مثلا ماژول utils) استفاده کرد.
Syntax:
class C(object): @staticmethod def fun(arg1, arg2, ...): ...
استاتیک متدها نیز محدود به کلاس هستنداما قادر نیستند state کلاس یا نمونه ساخته شده از کلاس را تغییر دهند و تنها به داده هایی که به آنها دسترسی دارند محدود شده اند. به طور کلی استاتیک متدها اطلاعاتی از state کلاس یا نمونه ساخته شده از کلاس ندارند. استاتیک متدها در حقیقت چیزی جز یک callable در یک کلاس نیستند که برای دسترسی به آن ها نیازی به نمونه سازی از کلاس نیست.
کاربرد استاتیک متدها در مواقعی است متد وظیفه پردازش مجزایی از سایر فعالیت اعضای کلاس را بر عهده دارد و نیاز به بیشتر برای ایجاد متدهای کاربردی و یا محاسباتی است.
from datetime import date class Person: def __init__(self, name, age): self.name = name self.age = age def sayHello(self, name): return(f"Hello {name}) @classmethod def fromBirthYear(cls, name, year): return cls(name, date.today().year - year) @staticmethod def isAdult(age): return age > 18
>>> person1 = Person('mayank', 21) >>> person2 = Person.fromBirthYear('mayank', 1996) >>> print person1.age >>> print person2.age >>> print Person.isAdult(21)
خروجی کد بالا به صورت زیر خواهد بود:
21 21 True