Classmethod vs. Staticmethod


Classmethod và Staticmethod là 2 kiểu method đặc biệt trong Python. Để có cái nhìn đầu tiên về 2 kiểu này, chúng ta cùng xem ví dụ:

Chúng ta có file

class A():
    def foo(self,x):
        print "Executing foo {0}, {1}".format(self,x)

    def class_foo(self,x):
        print "Executing class_foo {0}, {1}".format(self,x)

    def static_foo(x):
        print "Executing static_foo {0}".format(x)

a = A()

Kết quả:

Từ kết quả trên, ta thấy rằng method nhận 2 arguments là “__main__.A instance at 0x02398058” và “1”; method a.class_foo() nhận 2 arguments là “__main__.A” và “2”; còn method a.static_foo() chỉ nhận 1 argument là “3”.

Kết luận:

  • method foo() is bound to instances.
  • method class_foo() is not bound to instances, but bound to class, can be call using class.
  • method static_foo(): neither the object instance nor class is implicitly passed as the first argument.


1 – Classmethod

Classmethod’s main use is to define “inheritable alternative constructor” (overloading as Java, C++), used with @classmethod decorator.

Ví dụ:

class Date():
    def __init__(self, day=0, month=0, year=0): = day
        self.month = month
        self.year = year

    def from_string(cls,date_as_string):
        day, month, year = map(int, date_as_string.split('-'))
        date = cls(day, month, year)
        return date

    def __str__(self):
        return "{0:02d}.{1:02d}.{2}".format(, self.month, self.year)

date1 = Date(28,6,1994)
date2 = Date.from_string("22-11-1994")
print date1
print date2

Giải thích:

Class Date trong ví dụ trên có 2 constructor là __init__(self,…) và from_string(cls,…) dùng cho 2 kiểu dữ liệu khác nhau. Đối với constructor __init__(self,…) tham số đưa vào là day, month và year; đối với constructor from_string(cls,…) tham số là một string dạng “dd-mm-yy”.

Kết quả:
$ python
>> 28.06.1994
>> 22.11.1994

– Implementing date string parsing in one place and it’s reusable.
– Encapsulation.
– “cls” is an object that hold “class itself“, not an instance of the class. It’s pretty cool because if we inherit out Date class, all children will have “from_string” method defined also.

2 – Staticmethod

When the task is also logically bound to the class that we’ve created, but still don’t require instantiation of it. Used with @staticmethod decorator.

Ví dụ:

class Date():
    def is_date_valid(date_as_string):
        day,month,year = map(int, date_as_string.split('-'))
        return day <= 31 and month <= 12 and year <= 3999 

is_date = Date.is_date_valid("08-12-2017")

Kết quả:
$ python
>> True

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s