Tìm hiểu Instance, Static, Class method trong Python

0
1496

Phương thức trong Python có thể khó hiểu một khi bạn bước vào lập trình hướng đối tượng (OOP) với Python.

So sánh sự khác nhau giữa Instance, Static, Class method trong Python
Instance Method vs Class Methos vs Static Method

Bài hướng dẫn này sẽ giúp bạn tìm hiểu sự khác nhau giữa Instance method – Class method  – Static method trong Python.

3 Loại phương thức trong Python

Có ba loại phương thức trong Python:

  • Instance method
  • Class method
  • Static method

Biết được sự khác biệt là không cần thiết khi học Python cơ bản, nhưng một khi bạn học tới OOP, sự khác này có thể tạo ra một sự thay đổi lớn.

Nếu bạn mới tìm hiểu về Python thì mình khuyên bạn hãy đọc bài Tự học Python cơ bản trong 10 phút này trước.

Và trước khi chúng ta đi sâu hơn về 3 loại phương thức này, hãy:

Hiểu hơn về Decorator Patterns

Decorator Pattern là gì?

Decorator nghe có vẻ phức tạp, nhưng ở đó không có gì phải sợ.

Decorator đơn giản là function. Bạn có thể tự viết chúng hoặc sử dụng chúng trong các thư viện hoặc thư viện chuẩn Python (Python standard library).

Giống như bất kỳ function nào, Decorator thực hiện một nhiệm vụ.

Sự khác biệt ở đây là các Decorator áp dụng logic hoặc thay đổi hành vi của các function khác.

Chúng là một cách tốt để tái sử dụng code và có thể giúp phân tách logic thành các phần riêng lẻ.

Decorator pattern là cách thường dùng để xác định các static method hoặc class method. Đây là một ví dụ về Decorator trong Python:

class DecoratorExample:
  """ Class ví dụ về Decorator """
  def __init__(self):
    """ Thiết lập ví dụ """
    print('Hello, World!')

  @staticmethod
  def example_function():
    """ Phương thức này là một Decorator! """
    print('Hàm Decorator')
 
de = DecoratorExample()
de.example_function()

Decorator phải nằm ngay trước một khai triển của phương thức hoặc class.

Chúng bắt đầu bằng dấu @ và không giống như các phương thức thông thường, bạn không phải đặt dấu ngoặc đơn ở cuối trừ khi bạn truyền vào các đối số.

Nó có thể kết hợp nhiều decorator.

Instance Method trong Python

Các instance method là loại phương thức phổ biến nhất trong các class Python.

Chúng được gọi như vậy bởi vì chúng có thể truy cập dữ liệu duy nhất của thể hiện của chúng.

Nếu bạn có hai đối tượng được tạo từ một class car, thì mỗi đối tượng có thể có các thuộc tính khác nhau. Chúng có thể có màu sắc, kích thước, số ghế ngồi… khác nhau.

Các instance method phải có tham số self đầu tiên.

Self là một thuật ngữ đặc biệt khác của Python. Trong bất kỳ instance method nào, bạn có thể sử dụng self để truy cập bất kỳ dữ liệu hoặc phương thức nào có thể nằm trong class của bạn.

Tuy nhiên, các instance method là phổ biến nhất, nên không cần thiết phải có decorator.

Bất kỳ phương thức nào bạn tạo sẽ tự động được tạo như một instance method, trừ một số trường hợp bạn muốn nó là kiểu phương thức khác.

Dưới đây là một ví dụ về instance method:

class DecoratorExample:
  """ Class ví dụ về Decorator"""
  def __init__(self):
    """ Thiết lập ví dụ """
    print('Hello, World!')
    self.name = 'Decorator_Example'

  def example_function(self):
    """ Phương thức này là một Decorator! """
    print('Đây là instance method')
    print('Tên tôi là: ' + self.name)
 
de = DecoratorExample()
de.example_function()

Các biến name được truy cập thông qua self. Lưu ý rằng khi example_function được gọi, bạn không phải truyền self vào đó – Python đã tự làm rồi.

Static method trong Python

Các static method là các phương thức có liên quan đến một class theo một cách nào đó, nhưng không cần truy cập vào bất kỳ dữ liệu cụ thể nào của class.

Bạn không cần phải sử dụng self và bạn thậm chí không cần khởi tạo một thể hiện để có thể sử dụng static method, bạn chỉ cần gọi phương thức của mình:

class DecoratorExample:
  """ Class ví dụ về Decorator """
  def __init__(self):
    """ Thiết lập ví dụ """
    print('Hello, World!') 

  @staticmethod
  def example_function():
    """ Đây là một static method! """
    print(Tôi là một static method')
 
de = DecoratorExample.example_function()

@staticmethod được sử dụng để nói với Python rằng phương thức này là một static method.

Các static method rất tốt cho các hàm chỉ thực hiện một nhiệm vụ độc lập nào đó.

Chúng không cần phải (và không thể) truy cập dữ liệu của class.

Chúng phải hoàn toàn khép kín và chỉ hoạt động với dữ liệu được truyền vào dưới dạng đối số.

Bạn có thể sử dụng một static method để cộng hai số lại với nhau hoặc in một chuỗi đã cho.

Class method trong Python

Các class method là loại phương thức thứ ba và cuối cùng bạn cần biết.

Các class method biết về class của chúng. Chúng không thể truy cập dữ liệu của instance, nhưng chúng có thể gọi các static method khác.

Các class method không cần đối số self, nhưng chúng cần một tham số gọi là cls (Đây là viết tắt của class) và giống như selfcls được Python tự động truyền vào.

Các class method được tạo bằng cách Decorator @classmethod.

class DecoratorExample:
  """ Class ví dụ về Decorator """
  def __init__(self):
    """ Thiết lập ví dụ """
    print('Hello, World!') 

  @classmethod
  def example_function(cls):
    """ Đây là một class method! """
    print(Tôi là một class method!')
    cls.some_other_function()

  @staticmethod
    def some_other_function():
    print('Hello!')
 
de = DecoratorExample()
de.example_function()

Các class method có thể là các kiểu phương thức khó hiểu hơn trong ba loại phương thức trong Python, nhưng chúng có công dụng riêng của chúng.

Các class method có thể tự thao tác với class của chính nó, rất hữu ích khi bạn làm việc với các dự án lớn hơn, phức tạp hơn.

So sánh Class Method và Static Method

Class MethodStatic Method
Class method lấy cls là tham số đầu tiênStatic method không cần chỉ định bất kỳ tham số nào
Class method có thể truy cập và thay đổi trạng thái của classClass method không thể truy cập và thay đổi trạng thái của class
Class method lấy lớp làm tham số để biết về trạng thái của lớp đó.Các phương thức tĩnh không biết về trạng thái class. Các phương thức này được sử dụng để thực hiện một số tác vụ tiện ích bằng cách lấy một số tham số.
Decorator của class method là @classmethodDecorator của static method là @staticmethod

Khi nào thì sử dụng Instance Method, Static Method và Class Method?

Để có thể biết chính xác khi nào nên sử dụng sử dụng 1 trong 3 phương thức này thì bạn cần một chút thực hành.

Nhưng về cơ bản, chính khả năng của các phương thức này nói lên chỗ nó được sử dụng.

Lời kết

Như vậy, trong bài viết này mình đã giới thiệu cho bạn hiểu hơn về instance method, static method và class method trong Python.

Nếu có bất kỳ thắc mắc nào, bạn vui lòng để lại comment để mình giải đáp.

Hoặc tham gia Group: https://www.facebook.com/groups/hoihocpython/

Chúc bạn học Python tốt!

DevNET