Sunday, January 19, 2025

[Python] Lesson 43 – Method chaining

-

1. Method chaining là gì?

Method chaining là một kỹ thuật lập trình cho phép gọi liên tiếp nhiều phương thức trên một đối tượng mà không cần phải tạo các biến trung gian. Khi sử dụng method chaining, kết quả trả về của mỗi phương thức sẽ được sử dụng để gọi tiếp phương thức kế tiếp.

Cú pháp khai báo:

class MyClass:
    def method1(self):
        # Do something
        return self
        
    def method2(self):
        # Do something
        return self

Trong ví dụ trên, phương thức method1 và method2 trả về chính đối tượng của class MyClass.

  • Ví dụ về method chaining khi sử dụng thư viện Pandas để xử lý dữ liệu:
import pandas as pd

data = pd.read_csv('data.csv')
filtered_data = data.dropna().sort_values(by=['date']).reset_index(drop=True)

Trong ví dụ trên, phương thức dropna() loại bỏ các giá trị NaN và trả về đối tượng data đã được xử lý. Sau đó, phương thức sort_values() được áp dụng lên đối tượng filtered_data để sắp xếp dữ liệu theo cột date, và cuối cùng phương thức reset_index() được sử dụng để đặt lại chỉ số của các hàng.

  • Ví dụ về method chaining khi sử dụng thư viện BeautifulSoup để xử lý HTML:
from bs4 import BeautifulSoup
import requests

response = requests.get('http://example.com')
soup = BeautifulSoup(response.text, 'html.parser')

links = soup.find_all('a')
hrefs = [link.get('href') for link in links if link.get('href') is not None]

Trong ví dụ trên, phương thức get() được sử dụng để lấy nội dung trang web từ http://example.com. Sau đó, đối tượng response được truyền vào BeautifulSoup() để phân tích cú pháp HTML và tạo ra đối tượng soup. Tiếp theo, phương thức find_all() được áp dụng lên đối tượng soup để tìm tất cả các thẻ <a> và trả về một danh sách các đối tượng. Cuối cùng, phương thức get() được sử dụng để lấy giá trị của thuộc tính href cho mỗi đối tượng trong danh sách đó.

2. Chúng ta có thể sử dụng method chaining với các method khác nhau trên cùng một đối tượng để thực hiện nhiều thao tác trên đối tượng đó liên tiếp nhau.

Cú pháp khai báo method chaining:

class MyClass:
    def method1(self, arg1):
        # thực hiện thao tác
        return self

    def method2(self, arg2):
        # thực hiện thao tác
        return self

Trong đó, ta sử dụng từ khóa return self để trả về chính đối tượng đó, từ đó có thể sử dụng tiếp các method khác.

Ví dụ 1: Sử dụng method chaining để tạo chuỗi

class StringBuilder:
    def __init__(self):
        self.string = ""

    def append(self, text):
        self.string += text
        return self

    def reverse(self):
        self.string = self.string[::-1]
        return self

sb = StringBuilder()
sb.append("Hello").append(" ").append("world").reverse()

print(sb.string) # đầu ra: "dlrow olleH"

Ví dụ 2: Sử dụng method chaining để thực hiện các thao tác trên list

class ListOperations:
    def __init__(self, list):
        self.list = list

    def remove_duplicates(self):
        self.list = list(set(self.list))
        return self

    def sort(self):
        self.list.sort()
        return self

my_list = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8]
lo = ListOperations(my_list)
lo.remove_duplicates().sort()

print(lo.list) # đầu ra: [1, 2, 3, 4, 5, 6, 8, 9]

Đoạn code Python trên định nghĩa một lớp ListOperations có hai phương thức: remove_duplicatessort.

  • __init__ method:
    • Phương thức này là phương thức khởi tạo (constructor) của lớp ListOperations.
    • Nó nhận một đối số list và lưu trữ nó trong thuộc tính self.list của đối tượng.
def __init__(self, list):
    self.list = list

remove_duplicates method:

  • Phương thức này loại bỏ các phần tử trùng lặp từ danh sách.
  • Sử dụng hàm set() để chuyển danh sách thành một tập hợp (set), vì set không chứa các phần tử trùng lặp.
  • Sau đó, lại chuyển tập hợp này thành một danh sách bằng cách sử dụng list(set()).
  • Cuối cùng, gán danh sách mới cho thuộc tính self.list và trả về đối tượng self, cho phép gọi các phương thức tiếp theo theo kiểu chuỗi.
def remove_duplicates(self):
    self.list = list(set(self.list))
    return self

sort method:

  • Phương thức này sắp xếp danh sách theo thứ tự tăng dần.
  • Sử dụng phương thức sort() của danh sách để sắp xếp nó.
  • Tương tự như phương thức remove_duplicates, trả về đối tượng self để cho phép gọi các phương thức tiếp theo.
def sort(self):
    self.list.sort()
    return self

Cuối cùng, bạn tạo một đối tượng ListOperations với một danh sách đã cho (my_list) và gọi liên tiếp hai phương thức remove_duplicatessort trên đối tượng này. Kết quả cuối cùng là danh sách đã được loại bỏ các phần tử trùng lặp và được sắp xếp theo thứ tự tăng dần.

Ví dụ 3: Sử dụng method chaining để thực hiện các thao tác trên dataframe trong thư viện Pandas

import pandas as pd

class DataFrameOperations:
    def __init__(self, df):
        self.df = df

    def drop_columns(self, columns):
        self.df = self.df.drop(columns=columns)
        return self

    def rename_columns(self, new_names):
        self.df = self.df.rename(columns=new_names)
        return self

    def sort_values(self, column, ascending=True):
        self.df = self.df.sort_values(column, ascending=ascending)
        return self

data = {'name': ['Alice', 'Bob', 'Charlie'], 'age': [25, 30, 35], 'salary': [50000, 60000, 70000]}
df = pd.DataFrame(data)
df_ops = DataFrameOperations(df)
df_ops.drop_columns(['salary']).rename_columns({'name': 'Name', 'age': 'Age'}).sort_values('Age')

print(df_ops.df)

Kết quả đầu ra sẽ là một DataFrame mới đã được xử lý với các phương thức drop_columns, rename_columnssort_values được gọi theo thứ tự dùng method chaining.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories