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 selfTrong 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 selfTrong đó, 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_duplicates và sort.
__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ố
listvà lưu trữ nó trong thuộc tínhself.listcủa đối tượng.
- Phương thức này là phương thức khởi tạo (constructor) của lớp
def __init__(self, list):
self.list = listremove_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.listvà trả về đối tượngself, 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 selfsort 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ượngselfđể cho phép gọi các phương thức tiếp theo.
def sort(self):
self.list.sort()
return selfCuố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_duplicates và sort 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_columns và sort_values được gọi theo thứ tự dùng method chaining.
