Đăng nhập vào tài khoản Python Barsels của bạn để lưu cài đặt screencast của bạn.
Vẫn chưa có tài khoản? Đăng ký tại đây.
Hãy nói về cách các tác giả thư viện của bên thứ ba sử dụng các phương thức Dunder để làm cho các đối tượng Python của họ cảm thấy như các đối tượng Python bản địa.dunder methods to make their Python objects feel like native Python objects.
Người vận hành quá tải trong Python sử dụng các phương thức Dunder
Hãy thêm hai biến, x
và y
:
>>> x = 2
>>> y = 3
>>> x + y
5
Khi Python thực thi mã này, nó đã gọi phương thức __add__
trên x
, vượt qua nó y
:
Phương pháp __add__
được phát âm là "Dunder ADD", Dunder như trong Double Undercore vì nó bắt đầu và kết thúc bằng hai dấu gạch dưới.double underscore because it starts and ends with two underscores.
Nếu chúng ta tìm kiếm sự giúp đỡ trên x
[chỉ vào một số nguyên], chúng ta sẽ thấy có rất nhiều phương thức dunder [tất cả các phương pháp có tên
>>> help[x]
Help on int object:
class int[object]
| ...
|
| Methods defined here:
|
| __abs__[self, /]
| abs[self]
|
| __add__[self, value, /]
| Return self+value.
|
| __and__[self, value, /]
| Return self&value.
|
| __bool__[self, /]
| self != 0
|
| ...
3]:>>> help[x]
Help on int object:
class int[object]
| ...
|
| Methods defined here:
|
| __abs__[self, /]
| abs[self]
|
| __add__[self, value, /]
| Return self+value.
|
| __and__[self, value, /]
| Return self&value.
|
| __bool__[self, /]
| self != 0
|
| ...
Một phương pháp Dunder hoạt động như một hợp đồng giữa thông dịch viên Python và người đã tạo ra một lớp Python cụ thể.dunder method acts as a contract between the Python interpreter and the person who made a particular Python class.
Người đã tạo ra lớp
>>> help[x]
Help on int object:
class int[object]
| ...
|
| Methods defined here:
|
| __abs__[self, /]
| abs[self]
|
| __add__[self, value, /]
| Return self+value.
|
| __and__[self, value, /]
| Return self&value.
|
| __bool__[self, /]
| self != 0
|
| ...
4 đã xác định phương thức __add__
để cho Python biết rằng biểu tượng >>> help[x]
Help on int object:
class int[object]
| ...
|
| Methods defined here:
|
| __abs__[self, /]
| abs[self]
|
| __add__[self, value, /]
| Return self+value.
|
| __and__[self, value, /]
| Return self&value.
|
| __bool__[self, /]
| self != 0
|
| ...
6 hoạt động trên các đối tượng >>> help[x]
Help on int object:
class int[object]
| ...
|
| Methods defined here:
|
| __abs__[self, /]
| abs[self]
|
| __add__[self, value, /]
| Return self+value.
|
| __and__[self, value, /]
| Return self&value.
|
| __bool__[self, /]
| self != 0
|
| ...
4.Bổ sung phụ thuộc vào một phương pháp dunder, nhưng nhiều hoạt động khác cũng vậy. Trong thực tế, khi bạn cố gắng hỏi liệu hai điều có bình đẳng không, điều đó sử dụng phương pháp
>>> help[x]
Help on int object:
class int[object]
| ...
|
| Methods defined here:
|
| __abs__[self, /]
| abs[self]
|
| __add__[self, value, /]
| Return self+value.
|
| __and__[self, value, /]
| Return self&value.
|
| __bool__[self, /]
| self != 0
|
| ...
8. Ngay cả bình đẳng cũng dựa vào các phương pháp dunder trong Python!Gọi thủ công các phương thức Dunder
Phương pháp Dunder là một hợp đồng giữa người đã tạo ra lớp học và chính Python. Là lập trình viên Python, chúng tôi không nên gọi các phương thức Dunder trực tiếp. Thay vào đó, chúng tôi có nghĩa là sử dụng các hoạt động cấp cao [như các toán tử
>>> help[x]
Help on int object:
class int[object]
| ...
|
| Methods defined here:
|
| __abs__[self, /]
| abs[self]
|
| __add__[self, value, /]
| Return self+value.
|
| __and__[self, value, /]
| Return self&value.
|
| __bool__[self, /]
| self != 0
|
| ...
6 và >>> y = 3
>>> z = 3.0
>>> y.__eq__[z]
NotImplemented
0] dựa vào các phương thức Dunder đó.not supposed to call dunder methods directly. Instead, we're meant to use the high-level operations [like the >>> help[x]
Help on int object:
class int[object]
| ...
|
| Methods defined here:
|
| __abs__[self, /]
| abs[self]
|
| __add__[self, value, /]
| Return self+value.
|
| __and__[self, value, /]
| Return self&value.
|
| __bool__[self, /]
| self != 0
|
| ...
6 and >>> y = 3
>>> z = 3.0
>>> y.__eq__[z]
NotImplemented
0 operators] that rely on those dunder methods.Hãy xem một ví dụ về lý do tại sao chúng ta không nên gọi các phương thức Dunder trực tiếp.
Nếu chúng ta kiểm tra sự bình đẳng giữa số nguyên và số điểm nổi bằng cách gọi thủ công
>>> help[x]
Help on int object:
class int[object]
| ...
|
| Methods defined here:
|
| __abs__[self, /]
| abs[self]
|
| __add__[self, value, /]
| Return self+value.
|
| __and__[self, value, /]
| Return self&value.
|
| __bool__[self, /]
| self != 0
|
| ...
8, chúng ta sẽ thấy >>> y = 3
>>> z = 3.0
>>> y.__eq__[z]
NotImplemented
2:>>> y = 3
>>> z = 3.0
>>> y.__eq__[z]
NotImplemented
>>> y = 3
>>> z = 3.0
>>> y.__eq__[z]
NotImplemented
2 là một giá trị đặc biệt cho Python, như một số nguyên, tôi không biết cách kiểm tra bản thân để biết sự bình đẳng với số điểm nổi.Vì vậy, Python sau đó phải hỏi
>>> y = 3
>>> z = 3.0
>>> y.__eq__[z]
NotImplemented
4, số điểm nổi, "Bạn có bằng y
, số nguyên không?":Nó nói
>>> y = 3
>>> z = 3.0
>>> y.__eq__[z]
NotImplemented
6.Đó là lý do
>>> y = 3
>>> z = 3.0
>>> y.__eq__[z]
NotImplemented
7 thực sự hoạt động:Chúng tôi phải làm mọi thứ [như kiểm tra bình đẳng ở đây], sử dụng toán tử
>>> y = 3
>>> z = 3.0
>>> y.__eq__[z]
NotImplemented
0. Chúng tôi không nên sử dụng trực tiếp các phương thức Dunder. Công việc của Python là gọi các phương pháp Dunder; Công việc của chúng tôi là thực hiện hoạt động cấp cao thay thế.Phương pháp Dunder cung cấp năng lượng cho một số chức năng tích hợp
Phương pháp Dunder trong các nhà khai thác năng lượng Python như
>>> help[x]
Help on int object:
class int[object]
| ...
|
| Methods defined here:
|
| __abs__[self, /]
| abs[self]
|
| __add__[self, value, /]
| Return self+value.
|
| __and__[self, value, /]
| Return self&value.
|
| __bool__[self, /]
| self != 0
|
| ...
6, >>> name = "Trey"
>>> len[name]
4
0, >>> name = "Trey"
>>> len[name]
4
1 và >>> y = 3
>>> z = 3.0
>>> y.__eq__[z]
NotImplemented
0. Họ cũng cung cấp năng lượng cho một số chức năng tích hợp.power some of the built-in functions.Ví dụ: nếu bạn yêu cầu độ dài của một cái gì đó:
>>> name = "Trey"
>>> len[name]
4
Điều đó dựa trên phương pháp
>>> name = "Trey"
>>> len[name]
4
3:Hàm
>>> name = "Trey"
>>> len[name]
4
4 là một hàm tích hợp [trái ngược với phương pháp] vì Python đã quyết định rằng có độ dài là một thuộc tính cơ bản của một đối tượng. Vì vậy, Python có một chức năng tích hợp gọi là >>> name = "Trey"
>>> len[name]
4
4 ủy thác cho một phương thức Dunder được sử dụng để khám phá xem có một cái gì đó có độ dài và độ dài đó là bao nhiêu.Có độ dài là tất cả về việc có một phương pháp
>>> name = "Trey"
>>> len[name]
4
3:>>> numbers = [2, 1, 3, 4, 7]
>>> numbers.__len__[]
5
>>> len[numbers]
5
Trên thực tế, nhiều điều dường như, hoàn toàn cơ bản đối với Python, như lập chỉ mục một danh sách, được cung cấp bởi các phương pháp Dunder.
Bất cứ khi nào bạn sử dụng dấu ngoặc vuông trên một đối tượng trong Python, phương thức
>>> name = "Trey"
>>> len[name]
4
7 được gọi là:>>> numbers.__getitem__[0]
2
Bạn có thể sử dụng các phương thức Dunder để quá tải các toán tử
Vì vậy, các phương pháp Dunder, sức mạnh khá nhiều tất cả các nhà khai thác trong Python và thậm chí một số chức năng tích hợp.
Một phương pháp Dunder là một phương pháp [mà Python biết đến], có hai dấu gạch dưới trước đó và hai dấu gạch dưới sau đó.
Đó là một hợp đồng giữa người thực hiện một lớp nhất định và thông dịch viên Python, biết khi nào nên gọi phương thức Dunder cụ thể đó.
Nếu bạn tạo các lớp học của riêng mình trong Python, bạn có thể sử dụng các phương thức Dunder để vận hành quá tải. Và đó thực sự là những gì các tác giả thư viện của bên thứ ba làm, để làm cho các đối tượng trong thư viện của họ hoạt động như các đối tượng Python bản địa.