Trong bài học này, bạn sẽ thấy một cách pythonic để chuyển đổi các đối tượng Python thành các chuỗi bằng cách sử dụng __str__
. Bạn cũng sẽ học được ý nghĩa của __str__
và cũng học cách sử dụng nó trong một lớp Python:
class Car:
def __init__[self, color, mileage]:
self.color = color
self.mileage = mileage
def __str__[self]:
return 'a {self.color} car'.format[self=self]
00:00 Được rồi. Vì vậy, để dễ dàng vào điều này với một ví dụ đơn giản, tôi đã lấy cùng một lớp Car
và tôi đã thêm một phương thức .__str__[]
ở đây. Vì vậy, các phương pháp Dunder là các phương pháp bắt đầu với một dấu gạch dưới gấp đôi [____ 6], chỉ có loại được rút ngắn thành Dunder.
Okay. So, to ease into this with a simple example, I took the same Car
class and I added a .__str__[]
method here.
So, the dunder methods are methods that start with a double underscore [__
]—it’s just kind of been shortened to dunder.
00:14 Một số người gọi họ là phương pháp ma thuật, rất nhiều người không thích điều đó bởi vì họ không thực sự được coi là phép thuật theo bất kỳ cách nào. Họ chỉ là một hội nghị Python. Và Dunder, hoặc Double Undercore [__
], đánh dấu chúng là một điều Python cốt lõi, vì vậy các lớp không được cho là thực sự xác định các phương pháp Dunder của riêng họ vì nó có thể mâu thuẫn với các tính năng của Python trong tương lai. Some people refer to them as magic methods—a lot of people
don’t like that because they’re not really supposed to be magical in any way. They’re just supposed to be, well, a Python convention. And the dunder, or the
double underscore [__
], marks them as a core Python thing, so classes are not supposed to actually define their own dunder methods
because it could conflict with Python features in the future.
00:37 Và vì vậy đây chỉ là một cách để loại không gian tên này một chút, chỉ bằng một quy ước đặt tên, giữ chúng tách biệt một chút, giống như phương pháp .__init__[]
. And
so this is just a way to kind of namespace these things a little bit, just by a naming convention, kind of keeping them separate a little bit, just like the .__init__[]
method.
00:47 Nhưng bạn biết người phụ nữ ở đây. Vì vậy, những gì tôi đã làm ở đây là tôi đã thêm một phương pháp .__str__[]
. Và về cơ bản, những gì tôi đã làm ở đây, bất cứ khi nào phương pháp đó được gọi, nó chỉ trả lại
0 của return 'a {} car'.format[self.color]
Car
và loại cho chúng ta biết rằng đó là một Car
. But you know—total sidetrack here. So what I’ve done here is I added
a .__str__[]
method. And basically what I did here—whenever that method is called, it just returns the
return 'a {} car'.format[self.color]
0 of the Car
and kind of tells us it’s a Car
.01:00 Vì vậy, chỉ để cho bạn thấy một ví dụ ở đây, một lần nữa, tôi sẽ tạo ra So just to show you an example here—again, I’m going to create
01:05 Cùng Car
. Và bây giờ khi tôi in cái này Car
the same Car
. And now when I print this Car
01:12 Tôi thực sự nhận được một kết quả hoàn toàn khác, phải không? Vì vậy, lần này tôi nhận được ____ 15, đó là kết quả của phương pháp .__str__[]
này thay vì chuỗi điên này với địa chỉ đối tượng trong bộ nhớ. Tuy nhiên, khi tôi chỉ kiểm tra đối tượng này, tôi vẫn nhận được địa chỉ bộ nhớ trong kết quả trước đó. I actually
get a completely different result, right? So this time I get
return 'a {} car'.format[self.color]
5—which is the result of this .__str__[]
method—instead of this crazy string with
the object address in memory. However, when I just inspect this object, I still get the memory address in the previous result.
01:30 Vì vậy, kiểm tra đối tượng Car
vẫn cho kết quả tương tự, nhưng khi tôi in đối tượng Car
, tôi đã nhận được kết quả khác nhau dựa trên phương thức .__str__[]
. So, inspecting the Car
object still gives the same result, but when
I printed the Car
object, I got this different result based on the .__str__[]
method.
01:42 Cách bạn thực sự sẽ chuyển đổi một đối tượng thành chuỗi The way you would actually convert an object to string—if you wanted to force that or make that happen—
01:50 Bạn sẽ chỉ sử dụng phương thức __str__
0 tích hợp, và sau đó đó là nội bộ sẽ làm điều đúng đắn và gọi phương thức .__str__[]
, và nó sẽ cung cấp cho bạn kết quả đúng.
you would just use the built-in __str__
0 method, and then that is internally going to do the right thing and call the .__str__[]
method, and it’s going to give you back the right result.
02:01 Bây giờ, tất cả các chức năng này liên quan đến các biểu diễn văn bản cho các đối tượng, như hàm __str__
2, chúng sẽ làm điều đó trong nội bộ.
Now, all of these functions that deal with text representations for objects, like the __str__
2 function—they are going to do that internally.
02:09 Họ sẽ gọi chức năng __str__
0 cho bạn. Và nó sẽ giống nhau với một chuỗi định dạng, ví dụ. Vì vậy, nếu bạn làm điều này, thì điều này cũng sẽ gọi .__str__[]
và chỉ cho bạn kết quả. They’re going to call the __str__
0 function for you. And it
would be the same with a format string, for example. So if you do this, then this would also call .__str__[]
and just give you the result.
02:20 Nhưng điều quan trọng là ở đây là theo quy ước, nếu bạn thêm một phương thức .__str__[]
, thì nó sẽ làm rất nhiều điều tốt cho bạn trong việc kiểm soát cách đối tượng của bạn được biểu diễn dưới dạng chuỗi. Vì vậy, nó là cách Pythonic để làm điều này, đó là loại Chén Thánh, phải không? Bây giờ, những gì bạn đã thấy ở đây là khi tôi kiểm tra đối tượng __str__
6 trong bảng điều khiển, tôi vẫn nhận được kết quả tương tự.
But the key thing is here that by convention, if you add a .__str__[]
method,
then it’s going to do a lot of good for you in controlling how your object is represented as a string. So it’s the Pythonic way to do this,
which is kind of the Holy Grail, right? Now, still what you’re seeing here was that when I inspected the
__str__
6 object in the console, I still got the same result.
02:46 Vì vậy, dường như có những cách khác nhau để chuyển đổi các đối tượng của bạn thành chuỗi. Người đầu tiên chúng tôi vừa biết về nó, nó có tên là Dunder .__str__[]
.
So there seems to be different ways to convert your objects into strings. The first one we just learned about—it’s called dunder .__str__[]
.
02:55 Và bây giờ cái thứ hai được gọi là Dunder __str__
8. Hãy để nói về những gì __str__
8 làm và nó khác với .__str__[]
như thế nào. And now the second one is called dunder __str__
8. Let’s talk
about what __str__
8 does and how it’s different to .__str__[]
.
Tôi chỉ muốn giữ nó theo cách thời trang cũ:
return 'a {} car'.format[self.color]
Còn __str__
1 thì sao? 😃
@Rms hahah Nice, hadn đã nghe thấy điều đó trước đây: D Nó là một sự kết hợp hoàn hảo. Kiểm dịch Corona, mã hóa Python và xem lại văn phòng
Phần [self = self] từ dòng mã bên dưới khiến tôi bối rối. Những gì logic đằng sau nó? Đối với phần của tôi, tôi thích sử dụng dây F cho định dạng chuỗi.
def str [self]: return a {self.color} car.str[self]: return ‘a {self.color} car’.format[self=self]