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_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ố
list
và lưu trữ nó trong thuộc tínhself.list
củ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 = 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ượ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 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ượngself
để 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_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.