Cả hai hàm str() và repr() đều được sử dụng để lấy về dạng thức kiểu string của một đối tượng

1. Ví dụ về hàm str():

# -----------------------------------------------------------
#Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
#@author cafedevn
#Contact: cafedevn@gmail.com
#Fanpage: https://www.facebook.com/cafedevn
#Group: https://www.facebook.com/groups/cafedev.vn/
#Instagram: https://instagram.com/cafedevn
#Twitter: https://twitter.com/CafedeVn
#Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
#Pinterest: https://www.pinterest.com/cafedevvn/
#YouTube: https://www.youtube.com/channel/UCE7zpY_SlHGEgo67pHxqIoA/
# -----------------------------------------------------------

s = 'Hello, Cafedev.'
print str(s) 
print str(2.0/11.0) 

Kết quả in ra là:

Hello, Cafedev.
0.181818181818

2. Ví dụ về hàm repr():


s = 'Hello, Cafedev.'
print repr(s) 
print repr(2.0/11.0) 

Kết quả in ra là:

'Hello, Cafedev.'
0.18181818181818182

Từ kết quả đầu ra của đoạn chương trình ví dụ trên, chúng ta có thể thấy được rằng nếu chúng ta sử dụng hàm repr() để in ra chuỗi, thì chuỗi được in ra sẽ được bao bọc trong một cặp dấu nháy đơn (‘ ‘), và nếu chúng ta sử dụng hàm repr() để tính toán một giá trị cụ thể, thì ta sẽ thu được kết quả có độ chính xác cao hơn so với khi sử dụng hàm str().

Có thể liệt kê các điểm khác biệt giữa hàm str() và hàm repr() là:

– str() được sử dụng để tạo ra dữ liệu đầu ra dành cho người dùng cuối, trong khi hàm repr() được sử dụng chủ yếu cho việc debugging và phát triển phần mềm. Mục tiêu của hàm repr() là không rõ ràng, còn mục tiêu của hàm str() là cho ra một kết quả có thể đọc được, Ví dụ, nếu chúng ta nghi ngờ một số kiểu float đang tiềm tàng một lỗi nhỏ về việc làm tròn, thì hàm repr() sẽ cho chúng ta thấy được lỗi này có xảy ra hay không, trong khi hàm str() có thể sẽ không làm được điều đó.

– Hàm repr() sẽ tính toán dạng thức kiểu string “chính thức” của một đối tượng (một dạng thức mà chứa tất cả các thông tin về đối tượng), còn hàm str() thì được sử dụng để tính toán dạng thức kiểu string “không chính thức” của một đối tượng (một dạng thức hữu dụng khi cần in ra đối tượng).

– Câu lệnh print và hàm str() được tích hợp sẵn trong Python sử dụng __str__ để hiển thị dạng biểu diễn theo kiểu string của đối tượng, trong khi hàm repr() sẽ sử dụng __repr__ để hiển thị đối tượng.

Để có thể hiểu được những điều trên, chúng ta cùng theo dõi ví dụ sau:

import datetime 
today = datetime.datetime.now() 
  
# Prints readable format for date-time object 
print str(today) 
  
# prints the official format of date-time object 
print repr(today) 

Kết quả in ra là:

2016-02-22 19:32:04.078030
datetime.datetime(2016, 2, 22, 19, 32, 4, 78030)

Hàm str() hiển thị thông tin “date” của hôm nay theo một cách mà người dùng có thể hiển được cả ngày và giờ hiện tại là bao nhiêu.

Hàm repr() sẽ in ra dạng biểu diễn “chính thức” của một date-time object (đối tượng ngày-giờ) (nghĩa là bằng việc sử dụng dạng biểu diễn theo kiểu string “chính thức”, chúng ta có thể reconstruct – tái cấu trúc đối tượng).

3. Làm thế nào để sử dụng chúng bên trong các class do người dùng tự định nghĩa?

Một class do người dùng tự định nghĩa cũng nên có một hàm __repr__ nếu chúng ta muốn có được các thông tin cụ thể nhằm phục vụ cho việc debugging. Và nếu bạn nghĩ rằng việc có được một phiên bản thông tin biểu diễn theo kiểu string sẽ hữu dụng cho người dùng, thì chúng ta nên tạo ra một hàm __str__ nữa.

Dưới đây là đoạn chương trình Python mô tả cách viết hàm__repr__ và hàm __str__ cho một class do người dùng tự định nghĩa.

# -----------------------------------------------------------
#Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
#@author cafedevn
#Contact: cafedevn@gmail.com
#Fanpage: https://www.facebook.com/cafedevn
#Group: https://www.facebook.com/groups/cafedev.vn/
#Instagram: https://instagram.com/cafedevn
#Twitter: https://twitter.com/CafedeVn
#Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
#Pinterest: https://www.pinterest.com/cafedevvn/
#YouTube: https://www.youtube.com/channel/UCE7zpY_SlHGEgo67pHxqIoA/
# -----------------------------------------------------------

# Python program to demonstrate writing of __repr__ and 
# __str__ for user defined classes 
  
# A user defined class to represent Complex numbers 
class Complex: 
  
    # Constructor 
    def __init__(self, real, imag): 
       self.real = real 
       self.imag = imag 
  
    # For call to repr(). Prints object's information 
    def __repr__(self): 
       return 'Rational(%s, %s)' % (self.real, self.imag)     
  
    # For call to str(). Prints readable form 
    def __str__(self): 
       return '%s + i%s' % (self.real, self.imag)     
  
  
# Driver program to test above 
t = Complex(10, 20) 
  
print str(t)  # Same as "print t" 
print repr(t) 

Kết quả in ra là:

10 + i20
Rational(10, 20)

Nguồn và Tài liệu tiếng anh tham khảo:

Tài liệu từ cafedev:

Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa:

Chào thân ái và quyết thắng!

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!