Being educated under Java background, static method and class method are the same thing.
There is subtle difference:
Say function A () is defined in the parent class, while Sub class extends parent class
- If function A () has @staticmethod decorator, SUB.A () still refers to definition inside pare NT Class. Whereas,
- If function A () has @classmethod decorator, SUB.A () would points definition inside Sub Class.
Let's talk on some definitions here:
@staticmethod function is nothing more than a function defined inside a class. It is callable without instantiating the class first. It's definition is immutable via inheritance.
@classmethod function also callable without instantiating the class, but it definition follows Sub class, not Pa Rent class, via inheritance. That's because the first argument for @classmethod function must always be CLS (Class).
Let's assume an example of a class, the dealing with date information (this is what would be we boilerplate to cook on):
ClassDate(Object):Day=0Month=0 year =0
Def __ Init__ (self, Day=< Span class= "lit" >0, Month=0 , Year=0): self. Day = day self.= month self.= year
This class obviously could is used to the store information about certain dates (without timezone information; let's assume Al L dates is presented in UTC).
Here we have __init__
, a typical initializer of the Python class instances, which receives arguments as a typical instancemethod
, having th E First non-optional argument ( self
) that holds reference to a newly created instance.
Classmethod
We have some tasks, which can be nicely-done using classmethod
s.
Let's assume that we want to create a lot of Date
class instances have date information coming from outer source encode D as a string of next format (' dd-mm-yyyy '). We have the different places of our source code in project.
So, we must do here:
- Parse a string to receive day, month and year as thee integer variables or a 3-item tuple consisting of that variable.
- Instantiate by
Date
passing those values to initialization.
This would look like:
day, month, year = map(int, string_date.split(‘-‘))date1 =Date(day, month, year)
For this purpose, C + + has such feature as overloading and Python lacks that feature-so here's when classmethod
applies. Lets Create another "constructor".
@classmethod
DefFrom_string(Cls,Date_as_string):Day, Month, year = Map (int, date_as_string< Span class= "pun". split ( date1 Span class= "pun" >= Cls (day Month, Year) return< Span class= "PLN" > Date1date2 =date. From_string ( ' 11-09-2012 '
Let's look more carefully at the above implementation, and review what's advantages we have here:
- We ' ve implemented date string parsing in one place and it's reusable now.
- Encapsulation works fine here (if you think it could implement string parsing as a single function elsewher Lution fits OOP paradigm far better).
cls
is a object that holds class itself, not a instance of the class. It's pretty cool because if we inherit our Date
class and all children would have from_string
defined also.
Staticmethod
What's about staticmethod
? It's pretty similar to and classmethod
doesn ' t take any obligatory parameters (like classmethod
or instancemethod
does).
Let's look at the next use case.
We have a date string, which we want to validate somehow. This was also logically bound Date
to class we ' ve used so far, but still doesn ' t require instantiation of it.
Here's where staticmethod
can be useful. Let's look at the next piece of code:
@staticmethod
DefIs_date_valid(Date_as_string):Day,Month,Year=Map(Int, Date_as_string. ( '-' try:assert0<= day <=31assert0<= month <=12assert0<= year <=3999except Assertionerror:returnfalsereturntrue
So, as we can see from usage of staticmethod
, we don ' t has any access to what the class is-it ' s basically just a function, call Ed syntactically like a method, but without access to the object and it's internals (fields and another methods), while CL Assmethod does.
Ref:
Http://stackoverflow.com/questions/38238/what-are-class-methods-in-python-for
Http://stackoverflow.com/questions/136097/what-is-the-difference-between-staticmethod-and-classmethod-in-python
Http://stackoverflow.com/questions/12179271/python-classmethod-and-staticmethod-for-beginner
Http://julien.danjou.info/blog/2013/guide-python-static-class-abstract-methods
Python:staticmethod vs Classmethod