Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
Sự khác biệt giữa str và repr trong Python
Trong Python, hai phương thức đặc biệt str và repr được sử dụng để trả về chuỗi mô tả trạng thái của một đối tượng. Đối với các lớp (class) có sẵn, hai phương thức này đã được triển khai sẵn. Khi tạo lớp tùy chỉnh, bạn nên triển khai cả hai phương thức này để quản lý cách biểu diễn đối tượng dưới dạng chuỗi.
Định nghĩa hai phương thức đặc biệt str và repr trong Python
object.__str__(self)
- Được gọi bởi hàm
str(object)
hoặc các hàm nhưformat()
vàprint()
. - Trả về chuỗi "không chính thức" (informal) hoặc dễ đọc, dùng để hiển thị cho người dùng.
- Giá trị trả về phải là một đối tượng chuỗi (
string
).
object.__repr__(self)
- Được gọi bởi hàm
repr(object)
để trả về chuỗi biểu diễn "chính thức" (official) của đối tượng. - Chuỗi này thường được dùng cho mục đích gỡ lỗi (debugging) và cần rõ ràng, dễ hiểu với lập trình viên.
- Nếu một lớp chỉ định nghĩa
__repr__
mà không có__str__
, Python sẽ sử dụng__repr__
làm chuỗi không chính thức.
Tóm lại, chúng ta có thể nói:
__repr__
: Cần rõ ràng, không mơ hồ (thậm chí có thể đọc được bằng máy).__str__
: Dễ đọc, thân thiện với người dùng cuối.__repr__
là phương thức dự phòng cho__str__
nếu__str__
không được định nghĩa.- Hàm
print()
sử dụng__str__
, trong khirepr(object)
hoặc việc gọi trực tiếp đối tượng sẽ sử dụng__repr__
.
Quy tắc thực hành:
Bài viết này được đăng tại [free tuts .net]
Nếu chỉ định nghĩa một phương thức, hãy bắt đầu với __repr__
.
Một mẹo nhỏ:
__repr__
dành cho lập trình viên.__str__
dành cho người dùng cuối.
Ví dụ minh họa
import datetime today = datetime.datetime.now() print("Sử dụng str():", str(today)) # Kết quả: '2021-08-12 20:17:04.066084' print("Sử dụng repr():", repr(today)) # Kết quả: 'datetime.datetime(2021, 8, 12, 20, 17, 4, 66084)' print("Sử dụng print():") print(today) # __str__ được gọi # Kết quả: '2021-08-12 20:17:04.066084' print("Gọi trực tiếp đối tượng:") today # __repr__ được gọi # Kết quả: 'datetime.datetime(2021, 8, 12, 20, 17, 4, 66084)'
Phân tích:
__str__
: Hiển thị thông tin ngày giờ dưới dạng chuỗi dễ hiểu.__repr__
: Hiển thị thêm thông tin kỹ thuật, bao gồm tên module và các tham số tạo đối tượng.
Lưu ý:
Khi thiết kế lớp của riêng bạn, hãy đảm bảo rằng __repr__
cung cấp đủ thông tin để có thể tái tạo đối tượng, còn __str__
tập trung vào việc hiển thị thông tin thân thiện cho người dùng.
Kết bài