Cả hai phương thức str[] và repr[] trong python đều được sử dụng để biểu diễn chuỗi của một chuỗi. Mặc dù cả hai dường như phục vụ cùng một con nhộng, nhưng có một chút khác biệt giữa chúng
Bạn đã bao giờ để ý điều gì sẽ xảy ra khi bạn gọi hàm str[x] tích hợp sẵn của python trong đó x là bất kỳ đối tượng nào bạn muốn chưa? . __str__ là lựa chọn mặc định và __repr__ là dự phòng
Trước tiên hãy xem tài liệu python nói gì về chúng -
>>> help[str] Help on class str in module builtins: class str[object] | str[object=''] -> str | str[bytes_or_buffer[, encoding[, errors]]] -> str | | Create a new string object from the given object. >>> help[repr] Help on built-in function repr in module builtins: repr[obj, /] Return the canonical string representation of the object. For many object types, including most builtins, eval[repr[obj]] == obj.
Bây giờ, hãy cố gắng hiểu hai phương thức này bằng một vài ví dụ
>>> str[123] '123' >>> repr[123] '123' >>> #Above we see- with integer data, there is no difference >>> #Now let's try string data on these two methods >>> str['Python'] 'Python' >>> repr['Python'] "'Python'"
Trả về của repr[] và str[] giống nhau đối với giá trị số nguyên, nhưng có sự khác biệt giữa các giá trị trả về cho chuỗi – một giá trị chính thức và giá trị kia là không chính thức
Bây giờ, nếu bạn xem tài liệu chính thức về python - __str__ được sử dụng để tìm biểu diễn chuỗi "không chính thức" [có thể đọc được] của một đối tượng trong khi __repr__ được sử dụng để tìm biểu diễn chuỗi "chính thức" của một đối tượng
Sự khác biệt giữa các biểu diễn chính thức và không chính thức là việc triển khai mặc định __repr__ cho một giá trị str có thể được gọi làm đối số cho eval và giá trị trả về sẽ là một đối tượng chuỗi hợp lệ. Hàm này [repr[]] lấy một chuỗi và đánh giá nội dung của nó dưới dạng mã python
Vì vậy, khi chúng tôi chuyển "'Python'" cho nó, công việc của nó. Tuy nhiên, 'Python' dẫn đến lỗi vì nó được hiểu là biến Python, tất nhiên là không xác định. Dưới đây là mã để hiểu nó -
>>> x = "Python" >>> repr[x] "'Python'" >>> x1 = eval [repr[x]] >>> x == x1 True
Vì vậy, nếu chúng tôi cố gắng gọi giá trị trả về của __str__ làm đối số cho eval, thì nó không thành công
>>> y = "Python" >>> str[y] 'Python' >>> y1 = eval[str[y]] Traceback [most recent call last]: File "", line 1, in y1 = eval[str[y]] File "", line 1, in NameError: name 'Python' is not defined
Một ví dụ khác để chứng minh sự khác biệt giữa hai là -
>>> import datetime >>> now = datetime.datetime.now[] >>> str[now] '2019-03-29 01:29:23.211924' >>> repr[now] 'datetime.datetime[2019, 3, 29, 1, 29, 23, 211924]'
Ở kết quả trên, str[now] tính toán một chuỗi chứa giá trị của now trong khi repr[now] trả về mã python cần thiết để xây dựng lại đối tượng now của chúng ta
Bản tóm tắt. trong hướng dẫn này, bạn sẽ học cách sử dụng phương thức
0 dunder của Python và sự khác biệt giữa phương thứcCode language: Python [python]
person = Person['John', 'Doe', 25] print[repr[person]]
0 và
person = Person['John', 'Doe', 25] print[repr[person]]
Code language: Python [python]
2Code language: Python [python]
person = Person['John', 'Doe', 25] print[repr[person]]
Giới thiệu về phương pháp ma thuật Python person = Person['John', 'Doe', 25]
print[repr[person]]
Code language: Python [python]
0
person = Person['John', 'Doe', 25]
print[repr[person]]
Phương thức dunder của
0 xác định hành vi khi bạn truyền một thể hiện của một lớp choCode language: Python [python]
person = Person['John', 'Doe', 25] print[repr[person]]
5Code language: Python [python]
person = Person['John', 'Doe', 25] print[repr[person]]
Phương thức
0 trả về biểu diễn chuỗi của một đối tượng. Thông thường,Code language: Python [python]
person = Person['John', 'Doe', 25] print[repr[person]]
7 trả về một chuỗi có thể được thực thi và mang lại giá trị giống như đối tượngCode language: Python [python]
person = Person['John', 'Doe', 25] print[repr[person]]
Nói cách khác, nếu bạn chuyển chuỗi trả về của phương thức
8 cho hàmCode language: Python [python]
person = Person['John', 'Doe', 25] print[repr[person]]
9, bạn sẽ nhận được giá trị giống như giá trị của phương thứcCode language: Python [python]
person = Person['John', 'Doe', 25] print[repr[person]]
>>> str[123] '123' >>> repr[123] '123' >>> #Above we see- with integer data, there is no difference >>> #Now let's try string data on these two methods >>> str['Python'] 'Python' >>> repr['Python'] "'Python'"50. Hãy xem xét một ví dụ
Đầu tiên, định nghĩa lớp
>>> str[123] '123' >>> repr[123] '123' >>> #Above we see- with integer data, there is no difference >>> #Now let's try string data on these two methods >>> str['Python'] 'Python' >>> repr['Python'] "'Python'"51 với ba thuộc tính thể hiện
>>> str[123] '123' >>> repr[123] '123' >>> #Above we see- with integer data, there is no difference >>> #Now let's try string data on these two methods >>> str['Python'] 'Python' >>> repr['Python'] "'Python'"52,
>>> str[123] '123' >>> repr[123] '123' >>> #Above we see- with integer data, there is no difference >>> #Now let's try string data on these two methods >>> str['Python'] 'Python' >>> repr['Python'] "'Python'"53 và
>>> str[123] '123' >>> repr[123] '123' >>> #Above we see- with integer data, there is no difference >>> #Now let's try string data on these two methods >>> str['Python'] 'Python' >>> repr['Python'] "'Python'"54
>>> x = "Python" >>> repr[x] "'Python'" >>> x1 = eval [repr[x]] >>> x == x1 True0
Thứ hai, tạo một thể hiện mới của lớp
>>> str[123] '123' >>> repr[123] '123' >>> #Above we see- with integer data, there is no difference >>> #Now let's try string data on these two methods >>> str['Python'] 'Python' >>> repr['Python'] "'Python'"51 và hiển thị biểu diễn chuỗi của nó
Code language: Python [python]
person = Person['John', 'Doe', 25] print[repr[person]]
đầu ra
>>> str[123] '123' >>> repr[123] '123' >>> #Above we see- with integer data, there is no difference >>> #Now let's try string data on these two methods >>> str['Python'] 'Python' >>> repr['Python'] "'Python'"5
Theo mặc định, đầu ra chứa địa chỉ bộ nhớ của đối tượng
>>> str[123] '123' >>> repr[123] '123' >>> #Above we see- with integer data, there is no difference >>> #Now let's try string data on these two methods >>> str['Python'] 'Python' >>> repr['Python'] "'Python'"56. Để tùy chỉnh biểu diễn chuỗi của đối tượng, bạn có thể triển khai phương thức
0 như thế nàyCode language: Python [python]
person = Person['John', 'Doe', 25] print[repr[person]]
>>> x = "Python" >>> repr[x] "'Python'" >>> x1 = eval [repr[x]] >>> x == x1 True6
Khi bạn truyền một thể hiện của lớp
>>> str[123] '123' >>> repr[123] '123' >>> #Above we see- with integer data, there is no difference >>> #Now let's try string data on these two methods >>> str['Python'] 'Python' >>> repr['Python'] "'Python'"51 cho lớp
5, Python sẽ tự động gọi phương thứcCode language: Python [python]
person = Person['John', 'Doe', 25] print[repr[person]]
0. Ví dụCode language: Python [python]
person = Person['John', 'Doe', 25] print[repr[person]]
>>> y = "Python" >>> str[y] 'Python' >>> y1 = eval[str[y]] Traceback [most recent call last]: File "", line 1, in y1 = eval[str[y]] File "", line 1, in NameError: name 'Python' is not defined0
đầu ra
>>> y = "Python" >>> str[y] 'Python' >>> y1 = eval[str[y]] Traceback [most recent call last]: File "", line 1, in y1 = eval[str[y]] File "", line 1, in NameError: name 'Python' is not defined1
Nếu bạn thực thi chuỗi trả về
>>> x = "Python" >>> repr[x] "'Python'" >>> x1 = eval [repr[x]] >>> x == x1 True61, nó sẽ trả về đối tượng
>>> str[123] '123' >>> repr[123] '123' >>> #Above we see- with integer data, there is no difference >>> #Now let's try string data on these two methods >>> str['Python'] 'Python' >>> repr['Python'] "'Python'"56
Khi một lớp không triển khai phương thức
>>> x = "Python" >>> repr[x] "'Python'" >>> x1 = eval [repr[x]] >>> x == x1 True63 và bạn chuyển một thể hiện của lớp đó cho
>>> x = "Python" >>> repr[x] "'Python'" >>> x1 = eval [repr[x]] >>> x == x1 True64, Python sẽ trả về kết quả của phương thức
0 vì bên trong phương thứcCode language: Python [python]
person = Person['John', 'Doe', 25] print[repr[person]]
2 gọi phương thứcCode language: Python [python]
person = Person['John', 'Doe', 25] print[repr[person]]
0
person = Person['John', 'Doe', 25] print[repr[person]]
Code language: Python [python]
Ví dụ
>>> y = "Python" >>> str[y] 'Python' >>> y1 = eval[str[y]] Traceback [most recent call last]: File "", line 1, in y1 = eval[str[y]] File "", line 1, in NameError: name 'Python' is not defined9
đầu ra
>>> y = "Python" >>> str[y] 'Python' >>> y1 = eval[str[y]] Traceback [most recent call last]: File "", line 1, in y1 = eval[str[y]] File "", line 1, in NameError: name 'Python' is not defined1
Nếu một lớp triển khai phương thức
2, Python sẽ gọi phương thứcCode language: Python [python]
person = Person['John', 'Doe', 25] print[repr[person]]
2 khi bạn chuyển một thể hiện của lớp đó choCode language: Python [python]
person = Person['John', 'Doe', 25] print[repr[person]]
>>> x = "Python" >>> repr[x] "'Python'" >>> x1 = eval [repr[x]] >>> x == x1 True64. Ví dụ
>>> import datetime >>> now = datetime.datetime.now[] >>> str[now] '2019-03-29 01:29:23.211924' >>> repr[now] 'datetime.datetime[2019, 3, 29, 1, 29, 23, 211924]'4
đầu ra
>>> import datetime >>> now = datetime.datetime.now[] >>> str[now] '2019-03-29 01:29:23.211924' >>> repr[now] 'datetime.datetime[2019, 3, 29, 1, 29, 23, 211924]'5
person = Person['John', 'Doe', 25]
print[repr[person]]
Code language: Python [python]
2 so với person = Person['John', 'Doe', 25]
print[repr[person]]
Code language: Python [python]
0
person = Person['John', 'Doe', 25]
print[repr[person]]
person = Person['John', 'Doe', 25]
print[repr[person]]
Sự khác biệt chính giữa phương pháp
2 vàCode language: Python [python]
person = Person['John', 'Doe', 25] print[repr[person]]
0 là đối tượng dự địnhCode language: Python [python]
person = Person['John', 'Doe', 25] print[repr[person]]
Phương thức
2 trả về một biểu diễn chuỗi của một đối tượng mà con người có thể đọc được trong khi phương thứcCode language: Python [python]
person = Person['John', 'Doe', 25] print[repr[person]]
0 trả về một biểu diễn chuỗi của một đối tượng mà máy có thể đọc đượcCode language: Python [python]
person = Person['John', 'Doe', 25] print[repr[person]]