Ở đây, chúng tôi gán một giá trị
repr[obj]1 cho var. Sau đó, hàm
repr[]
trả về repr[obj]3,
repr[obj]1 bên trong dấu ngoặc kép
Khi kết quả từ repr[]
được truyền cho
repr[obj]6, chúng ta sẽ nhận được đối tượng ban đầu [cho nhiều loại]
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 rằng nếu chúng ta sử dụng hàm repr[] để vào chuỗi ra, thì chuỗi được đưa vào ra sẽ được bao bọc trong một đơn nháy nháy đơn [
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 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 gỡ lỗi 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à để đưa 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 tàng trữ một lỗi nhỏ về
– Hàm repr[] sẽ tính toán dạng thức thức chuỗi “chính thức” của một đối tượng [một dạng thức 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
– 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ị biểu thức biểu diễn theo kiểu chuỗi 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ả trong 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 “ngày” của hôm nay theo một cách mà người dùng có thể hiển thị cả ngày và giờ hiện tại là bao nhiêu
Hàm repr[] sẽ ở dạng biểu diễn “chính thức” của một đối tượng ngày-giờ [đối tượng ngày-giờ] [nghĩa là bằng cách sử dụng biểu thức biểu thức theo kiểu chuỗi “chính thức”, chúng ta có thể tái tạo lại
3. Làm thế nào để sử dụng chúng bên trong các lớp do người dùng định nghĩa?
Một lớp do người dùng tự định nghĩa cũng nên có một hàm __repr__ nếu họ muốn có được các thông tin công cụ có thể phục vụ cho công việc gỡ lỗi. Và nếu bạn nghĩ rằng công việc có một phiên bản thông tin biểu diễn theo kiểu chuỗi sẽ hữu ích 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 lớp 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: //www.facebook.com/cafedevn
#Group: //www.facebook.com/groups/cafedev.vn/
#Instagram: //instagram.com/cafedevn
#Twitter: //twitter.com/CafedeVn
#Linkedin: //www.linkedin.com/in/cafe-dev-407054199/
#Pinterest: //www.pinterest.com/cafedevvn/
#YouTube: //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ả trong ra là
10 + i20
Rational[10, 20]
Nguồn và Tài liệu tiếng anh tham khảo
- w3school
- con trăn. tổ chức
- chuyên viên máy tính
Tài liệu từ cafedev
- Trọn bộ tự học Python từ cơ bản tăng cao tại đây nha
- Ebook về python tại đây
- Các chuỗi tự học lập trình khác nhau
Nếu 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
Python nói “__repr__” được sử dụng để lấy biểu diễn chuỗi của đối tượng trong khi __str__” được sử dụng để tìm biểu diễn chuỗi “không chính thức” của một đối tượng. Nhưng, tại sao chúng ta cần hai đại diện khác nhau?
Giả sử chúng ta đang làm việc với mã. Chúng tôi đã giới thiệu một lớp có tên là “Animal” và chúng tôi đã xây dựng một đối tượng “a” cho nó
Bây giờ, khi chương trình này chạy, nó sẽ trả về một cái gì đó không thể đọc được như thế này
Cách giải quyết chung cho vấn đề này là chúng ta gọi trực tiếp các thuộc tính của lớp và nhận kết quả là “Dog” và “Pomeranian” trong trường hợp của chúng ta
print[a.animal]
print[a.name]
Nhưng trên thực tế, có một quy ước trong Python xử lý tất cả đoạn mã “in” ở trên mà chúng tôi đã viết. Tôi muốn giải thích cách nó hoạt động và cách __repr__ và __str__ hoạt động. Đây cũng là một trong những câu hỏi được hỏi nhiều nhất trong các cuộc phỏng vấn. Vậy nên hãy chờ trong giây lát
__str__
Hãy học cùng lớp Động vật để làm mọi thứ dễ dàng hơn. Vì vậy, tôi vừa thêm một phương thức str dunder trong lớp
Về cơ bản những gì phương thức dunder của tôi làm ở đây là bất cứ khi nào chúng ta gọi lớp, nó sẽ trả về cho chúng ta một đầu ra chuỗi “A Pomeranian Dog” thay vì id đối tượng trong bộ nhớ
Tuy nhiên, nếu bạn chỉ kiểm tra đối tượng, bạn vẫn sẽ nhận được địa chỉ bộ nhớ
Vì vậy, kiểm tra đối tượng Animal vẫn cung cấp địa chỉ bộ nhớ nhưng khi chúng tôi in đối tượng, chúng tôi nhận được một kết quả khác dựa trên phương thức __str__
Vì vậy, để khắc phục điều này, bạn cũng có thể làm một cái gì đó như thế này
Nó cũng sẽ trả lại cho bạn đầu ra chuỗi. Về cơ bản, bạn đang buộc một đối tượng chuyển đổi thành chuỗi. Và, nó sẽ gọi phương thức dunder str để làm điều đó
__repr__
Chúng tôi vừa biết về __str__. Bây giờ, cái thứ hai được gọi là __repr__. Hãy hiểu nó khác với __str__ như thế nào
Đoạn mã dưới đây sẽ giúp bạn hiểu toàn bộ kịch bản của __str__ và __repr__ xảy ra bí mật
Khi chúng ta vừa kiểm tra đối tượng, __repr__ được gọi trong khi khi chúng ta sử dụng phương thức in, __str__ được gọi
Trong một ví dụ khác, tôi đã gọi cả hai phương thức “str” và “repr” trên một đối tượng datetime
Sử dụng str đã chuyển đổi đối tượng thành chuỗi và làm cho nó có thể đọc được. Mặc dù repr phải rõ ràng và có nhiều ý nghĩa hơn cho việc gỡ lỗi và sử dụng nội bộ
Phần kết luận
__str__ hoặc str[] được sử dụng để tạo đầu ra mà con người có thể đọc được phải dành cho người dùng cuối. Nhưng, repr[] hoặc __repr__ phải phục vụ mục đích gỡ lỗi và phát triển