>>> classOrder:.. def__init__(self,cart,customer):.. self.cart=list(cart).. self.customer=customer...>>> order=Order(['banana','apple','mango'],'Real Python')>>> len(order)# Calling len when no __len__Traceback (most recent call last):
File "<stdin>", line 1, in <module>TypeError: object of type 'Order' has no len()
>>> # Adds the two numbers>>> 1+23>>> # Concatenates the two strings>>> 'Real'+'Python''RealPython'>>> # Gives the product>>> 3*26>>> # Repeats the string>>> 'Python'*3'PythonPythonPython'
Bạn có thể thắc mắc làm thế nào mà cùng một toán tử hoặc hàm dựng sẵn lại hiển thị các hành vi khác nhau đối với các đối tượng thuộc các lớp khác nhau. Điều này được gọi là nạp chồng toán tử hoặc nạp chồng hàm tương ứng. Bài viết này sẽ giúp bạn hiểu cơ chế này, để bạn có thể thực hiện tương tự trong các lớp Python của riêng mình và làm cho các đối tượng của bạn giống Pythonic hơn
Bạn sẽ học những điều sau đây
API xử lý toán tử và tích hợp sẵn trong Python
“Bí mật” đằng sau
>>> classOrder:.. def__init__(self,cart,customer):.. self.cart=list(cart).. self.customer=customer...>>> order=Order(['banana','apple','mango'],'Real Python')>>> len(order)# Calling len when no __len__Traceback (most recent call last):
File "<stdin>", line 1, in <module>TypeError: object of type 'Order' has no len()
1 và các phần mềm tích hợp khác
Cách làm cho các lớp của bạn có khả năng sử dụng các toán tử
Cách làm cho các lớp của bạn tương thích với các hàm dựng sẵn của Python
Tiền thưởng miễn phí. Nhấp vào đây để có quyền truy cập vào Bảng cheat Python OOP miễn phí chỉ cho bạn các hướng dẫn, video và sách hay nhất để tìm hiểu thêm về Lập trình hướng đối tượng với Python
Ngoài ra, bạn cũng sẽ thấy một lớp ví dụ, các đối tượng của lớp này sẽ tương thích với nhiều toán tử và hàm này. Bắt đầu nào
Mô hình dữ liệu Python
Giả sử bạn có một lớp đại diện cho một đơn đặt hàng trực tuyến có một giỏ hàng (một
>>> classOrder:.. def__init__(self,cart,customer):.. self.cart=list(cart).. self.customer=customer...>>> order=Order(['banana','apple','mango'],'Real Python')>>> len(order)# Calling len when no __len__Traceback (most recent call last):
File "<stdin>", line 1, in <module>TypeError: object of type 'Order' has no len()
8 hoặc phiên bản của một lớp khác đại diện cho một khách hàng)
Ghi chú. Nếu bạn cần xem lại OOP trong Python, hãy xem hướng dẫn này trên Real Python. Lập trình hướng đối tượng (OOP) trong Python 3
Trong trường hợp như vậy, việc muốn có được độ dài của danh sách giỏ hàng là điều hoàn toàn tự nhiên. Một người mới sử dụng Python có thể quyết định triển khai một phương thức có tên là
>>> classOrder:.. def__init__(self,cart,customer):.. self.cart=list(cart).. self.customer=customer...>>> order=Order(['banana','apple','mango'],'Real Python')>>> len(order)# Calling len when no __len__Traceback (most recent call last):
File "<stdin>", line 1, in <module>TypeError: object of type 'Order' has no len()
4 trong lớp của họ để thực hiện việc này. Nhưng bạn có thể định cấu hình
>>> classOrder:.. def__init__(self,cart,customer):.. self.cart=list(cart).. self.customer=customer...>>> order=Order(['banana','apple','mango'],'Real Python')>>> len(order)# Calling len when no __len__Traceback (most recent call last):
File "<stdin>", line 1, in <module>TypeError: object of type 'Order' has no len()
1 tích hợp theo cách nó trả về độ dài của danh sách giỏ hàng khi được cung cấp đối tượng của chúng ta
Trong một trường hợp khác, chúng tôi có thể muốn thêm thứ gì đó vào giỏ hàng. Một lần nữa, một người mới sử dụng Python sẽ nghĩ đến việc triển khai một phương thức có tên là
>>> classOrder:.. def__init__(self,cart,customer):.. self.cart=list(cart).. self.customer=customer...>>> order=Order(['banana','apple','mango'],'Real Python')>>> len(order)# Calling len when no __len__Traceback (most recent call last):
File "<stdin>", line 1, in <module>TypeError: object of type 'Order' has no len()
6 lấy một mặt hàng và thêm nó vào danh sách giỏ hàng. Nhưng bạn có thể định cấu hình toán tử
Python thực hiện tất cả điều này bằng các phương thức đặc biệt. Các phương thức đặc biệt này có quy ước đặt tên, trong đó tên bắt đầu bằng hai dấu gạch dưới, theo sau là một mã định danh và kết thúc bằng một cặp dấu gạch dưới khác
Về cơ bản, mỗi hàm hoặc toán tử tích hợp có một phương thức đặc biệt tương ứng với nó. Ví dụ: có
>>> classOrder:.. def__init__(self,cart,customer):.. self.cart=list(cart).. self.customer=customer...>>> order=Order(['banana','apple','mango'],'Real Python')>>> len(order)# Calling len when no __len__Traceback (most recent call last):
File "<stdin>", line 1, in <module>TypeError: object of type 'Order' has no len()
8 tương ứng với
>>> classOrder:.. def__init__(self,cart,customer):.. self.cart=list(cart).. self.customer=customer...>>> order=Order(['banana','apple','mango'],'Real Python')>>> len(order)# Calling len when no __len__Traceback (most recent call last):
File "<stdin>", line 1, in <module>TypeError: object of type 'Order' has no len()
Theo mặc định, hầu hết các toán tử và tích hợp sẵn sẽ không hoạt động với các đối tượng trong lớp của bạn. Bạn phải thêm các phương thức đặc biệt tương ứng trong định nghĩa lớp của mình để làm cho đối tượng của bạn tương thích với các toán tử và tích hợp sẵn
Khi bạn thực hiện điều này, hành vi của hàm hoặc toán tử được liên kết với nó sẽ thay đổi theo hành vi được xác định trong phương thức
Đây chính là điều mà Mô hình dữ liệu (Phần 3 của tài liệu Python) giúp bạn hoàn thành. Nó liệt kê tất cả các phương thức đặc biệt có sẵn và cung cấp cho bạn phương tiện nạp chồng các hàm và toán tử dựng sẵn để bạn có thể sử dụng chúng trên các đối tượng của riêng mình
Hãy xem điều này có nghĩa là gì
Sự thật thú vị. Do quy ước đặt tên được sử dụng cho các phương thức này, chúng còn được gọi là phương thức dunder, viết tắt của phương thức gạch dưới kép. Đôi khi chúng còn được gọi là phương pháp đặc biệt hoặc phương pháp ma thuật. Mặc dù vậy, chúng tôi thích các phương pháp dunder hơn
Loại bỏ các quảng cáo
Nội bộ của các hoạt động như >>> class Order:
.. def __init__(self, cart, customer):
.. self.cart = list(cart)
.. self.customer = customer
...
>>> order = Order(['banana', 'apple', 'mango'], 'Real Python')
>>> len(order) # Calling len when no __len__
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: object of type 'Order' has no len()
1 và >>> class Order:
.. def __init__(self, cart, customer):
.. self.cart = list(cart)
.. self.customer = customer
...
.. def __len__(self):
.. return len(self.cart)
...
>>> order = Order(['banana', 'apple', 'mango'], 'Real Python')
>>> len(order)
3
53
Mỗi lớp trong Python định nghĩa hành vi riêng của nó cho các hàm và phương thức tích hợp. Khi bạn chuyển một thể hiện của lớp nào đó cho một hàm dựng sẵn hoặc sử dụng một toán tử trên thể hiện đó, nó thực sự tương đương với việc gọi một phương thức đặc biệt với các đối số liên quan
>>> classOrder:.. def__init__(self,cart,customer):.. self.cart=list(cart).. self.customer=customer...>>> order=Order(['banana','apple','mango'],'Real Python')>>> len(order)# Calling len when no __len__Traceback (most recent call last):
File "<stdin>", line 1, in <module>TypeError: object of type 'Order' has no len()
Do đó, khi bạn định nghĩa các phương thức đặc biệt này trong lớp của riêng mình, bạn sẽ ghi đè hành vi của hàm hoặc toán tử được liên kết với chúng bởi vì, đằng sau hậu trường, Python đang gọi phương thức của bạn. Hãy hiểu rõ hơn về điều này
Như bạn có thể thấy, khi bạn sử dụng hàm hoặc phương thức đặc biệt tương ứng của nó, bạn sẽ nhận được kết quả tương tự. Trên thực tế, khi bạn lấy danh sách các thuộc tính và phương thức của một đối tượng
85, v.v. Để làm điều này, bạn chỉ cần định nghĩa phương thức đặc biệt tương ứng trong lớp của mình. Hãy xem xét một vài ví dụ
Cung cấp độ dài cho các đối tượng của bạn bằng cách sử dụng >>> class Order:
.. def __init__(self, cart, customer):
.. self.cart = list(cart)
.. self.customer = customer
...
>>> order = Order(['banana', 'apple', 'mango'], 'Real Python')
>>> len(order) # Calling len when no __len__
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: object of type 'Order' has no len()
1
Để thay đổi hành vi của
>>> classOrder:.. def__init__(self,cart,customer):.. self.cart=list(cart).. self.customer=customer...>>> order=Order(['banana','apple','mango'],'Real Python')>>> len(order)# Calling len when no __len__Traceback (most recent call last):
File "<stdin>", line 1, in <module>TypeError: object of type 'Order' has no len()
88 trong lớp của mình. Bất cứ khi nào bạn chuyển một đối tượng trong lớp của mình tới
>>> classOrder:.. def__init__(self,cart,customer):.. self.cart=list(cart).. self.customer=customer...>>> order=Order(['banana','apple','mango'],'Real Python')>>> len(order)# Calling len when no __len__Traceback (most recent call last):
File "<stdin>", line 1, in <module>TypeError: object of type 'Order' has no len()
>>> classOrder:.. def__init__(self,cart,customer):.. self.cart=list(cart).. self.customer=customer...>>> order=Order(['banana','apple','mango'],'Real Python')>>> len(order)# Calling len when no __len__Traceback (most recent call last):
File "<stdin>", line 1, in <module>TypeError: object of type 'Order' has no len()
>>> classOrder:.. def__init__(self,cart,customer):.. self.cart=list(cart).. self.customer=customer...>>> order=Order(['banana','apple','mango'],'Real Python')>>> len(order)# Calling len when no __len__Traceback (most recent call last):
File "<stdin>", line 1, in <module>TypeError: object of type 'Order' has no len()
1 để lấy trực tiếp chiều dài của giỏ hàng. Hơn nữa, sẽ có ý nghĩa trực quan hơn khi nói "độ dài của đơn đặt hàng" thay vì gọi một cái gì đó như
>>> # Adds the two numbers>>> 1+23>>> # Concatenates the two strings>>> 'Real'+'Python''RealPython'>>> # Gives the product>>> 3*26>>> # Repeats the string>>> 'Python'*3'PythonPythonPython'
13. Cuộc gọi của bạn vừa Pythonic vừa trực quan hơn. Khi bạn không xác định phương thức
>>> classOrder:.. def__init__(self,cart,customer):.. self.cart=list(cart).. self.customer=customer...>>> order=Order(['banana','apple','mango'],'Real Python')>>> len(order)# Calling len when no __len__Traceback (most recent call last):
File "<stdin>", line 1, in <module>TypeError: object of type 'Order' has no len()
>>> classOrder:.. def__init__(self,cart,customer):.. self.cart=list(cart).. self.customer=customer...>>> order=Order(['banana','apple','mango'],'Real Python')>>> len(order)# Calling len when no __len__Traceback (most recent call last):
File "<stdin>", line 1, in <module>TypeError: object of type 'Order' has no len()
Tuy nhiên, khi quá tải
>>> classOrder:.. def__init__(self,cart,customer):.. self.cart=list(cart).. self.customer=customer...>>> order=Order(['banana','apple','mango'],'Real Python')>>> len(order)# Calling len when no __len__Traceback (most recent call last):
File "<stdin>", line 1, in <module>TypeError: object of type 'Order' has no len()
1, bạn nên nhớ rằng Python yêu cầu hàm trả về một số nguyên. Nếu phương thức của bạn trả về bất kỳ giá trị nào khác ngoài số nguyên, bạn sẽ nhận được _____381. Điều này, rất có thể, là để giữ cho nó phù hợp với thực tế là
>>> classOrder:.. def__init__(self,cart,customer):.. self.cart=list(cart).. self.customer=customer...>>> order=Order(['banana','apple','mango'],'Real Python')>>> len(order)# Calling len when no __len__Traceback (most recent call last):
File "<stdin>", line 1, in <module>TypeError: object of type 'Order' has no len()
1 thường được sử dụng để lấy độ dài của một chuỗi, mà chỉ có thể là một số nguyên
Làm cho các đối tượng của bạn hoạt động với >>> class Order:
.. def __init__(self, cart, customer):
.. self.cart = list(cart)
.. self.customer = customer
...
>>> order = Order(['banana', 'apple', 'mango'], 'Real Python')
>>> len(order) # Calling len when no __len__
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: object of type 'Order' has no len()
00
Bạn có thể ra lệnh cho hành vi của các đối tượng trong lớp của mình bằng cách định nghĩa phương thức đặc biệt
>>> classOrder:.. def__init__(self,cart,customer):.. self.cart=list(cart).. self.customer=customer...>>> order=Order(['banana','apple','mango'],'Real Python')>>> len(order)# Calling len when no __len__Traceback (most recent call last):
File "<stdin>", line 1, in <module>TypeError: object of type 'Order' has no len()
02 trong lớp. Không có giới hạn nào đối với giá trị trả về của
>>> classOrder:.. def__init__(self,cart,customer):.. self.cart=list(cart).. self.customer=customer...>>> order=Order(['banana','apple','mango'],'Real Python')>>> len(order)# Calling len when no __len__Traceback (most recent call last):
File "<stdin>", line 1, in <module>TypeError: object of type 'Order' has no len()
81 khi phương thức đặc biệt không có trong định nghĩa lớp của bạn
Trong một lớp biểu diễn một vectơ trong không gian hai chiều, có thể sử dụng
>>> classOrder:.. def__init__(self,cart,customer):.. self.cart=list(cart).. self.customer=customer...>>> order=Order(['banana','apple','mango'],'Real Python')>>> len(order)# Calling len when no __len__Traceback (most recent call last):
File "<stdin>", line 1, in <module>TypeError: object of type 'Order' has no len()
Sẽ có ý nghĩa trực quan hơn khi nói "giá trị tuyệt đối của vectơ" thay vì gọi một cái gì đó như
>>> classOrder:.. def__init__(self,cart,customer):.. self.cart=list(cart).. self.customer=customer...>>> order=Order(['banana','apple','mango'],'Real Python')>>> len(order)# Calling len when no __len__Traceback (most recent call last):
File "<stdin>", line 1, in <module>TypeError: object of type 'Order' has no len()
06Loại bỏ các quảng cáo
In các đối tượng của bạn đẹp mắt bằng cách sử dụng >>> class Order:
.. def __init__(self, cart, customer):
.. self.cart = list(cart)
.. self.customer = customer
...
>>> order = Order(['banana', 'apple', 'mango'], 'Real Python')
>>> len(order) # Calling len when no __len__
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: object of type 'Order' has no len()
07
Tích hợp sẵn
>>> classOrder:.. def__init__(self,cart,customer):.. self.cart=list(cart).. self.customer=customer...>>> order=Order(['banana','apple','mango'],'Real Python')>>> len(order)# Calling len when no __len__Traceback (most recent call last):
File "<stdin>", line 1, in <module>TypeError: object of type 'Order' has no len()
07 được sử dụng để truyền một thể hiện của một lớp thành một đối tượng
8, hoặc thích hợp hơn, để có được một biểu diễn chuỗi thân thiện với người dùng của đối tượng mà người dùng bình thường có thể đọc được chứ không phải lập trình viên. Bạn có thể xác định định dạng chuỗi mà đối tượng của bạn sẽ được hiển thị khi được chuyển đến
>>> classOrder:.. def__init__(self,cart,customer):.. self.cart=list(cart).. self.customer=customer...>>> order=Order(['banana','apple','mango'],'Real Python')>>> len(order)# Calling len when no __len__Traceback (most recent call last):
File "<stdin>", line 1, in <module>TypeError: object of type 'Order' has no len()
Đại diện cho các đối tượng của bạn bằng cách sử dụng >>> class Order:
.. def __init__(self, cart, customer):
.. self.cart = list(cart)
.. self.customer = customer
...
.. def __len__(self):
.. return len(self.cart)
...
>>> order = Order(['banana', 'apple', 'mango'], 'Real Python')
>>> len(order)
3
310
310 được sử dụng để lấy biểu diễn chuỗi có thể phân tích cú pháp của một đối tượng. Nếu một đối tượng có thể phân tích cú pháp, điều đó có nghĩa là Python sẽ có thể tạo lại đối tượng từ biểu diễn khi
>>> # Adds the two numbers>>> 1+23>>> # Concatenates the two strings>>> 'Real'+'Python''RealPython'>>> # Gives the product>>> 3*26>>> # Repeats the string>>> 'Python'*3'PythonPythonPython'
315 để in đối tượng, cũng như để biểu diễn đối tượng khi
>>> classOrder:.. def__init__(self,cart,customer):.. self.cart=list(cart).. self.customer=customer...>>> order=Order(['banana','apple','mango'],'Real Python')>>> len(order)# Calling len when no __len__Traceback (most recent call last):
File "<stdin>", line 1, in <module>TypeError: object of type 'Order' has no len()
07 được gọi trên đó. Nếu thiếu cả hai phương thức, nó sẽ mặc định là
331 (______3332 trong Python 2. x) phương pháp đặc biệt
Hành vi được xác định ở đây sẽ xác định giá trị thực của một thể hiện trong tất cả các ngữ cảnh yêu cầu lấy giá trị thực, chẳng hạn như trong các câu lệnh
334 đã được định nghĩa ở trên, một thể hiện có thể được coi là đúng nếu độ dài của danh sách giỏ hàng khác không. Điều này có thể được sử dụng để kiểm tra xem một đơn đặt hàng có nên được xử lý hay không
>>>
>>> classOrder:.. def__init__(self,cart,customer):.. self.cart=list(cart).. self.customer=customer...>>> order=Order(['banana','apple','mango'],'Real Python')>>> len(order)# Calling len when no __len__Traceback (most recent call last):
File "<stdin>", line 1, in <module>TypeError: object of type 'Order' has no len()
Có nhiều phương thức đặc biệt hơn làm quá tải các hàm tích hợp. Bạn có thể tìm thấy chúng trong. Đã thảo luận về một số trong số họ, hãy chuyển sang các toán tử
Quá tải các toán tử tích hợp
Thay đổi hành vi của toán tử cũng đơn giản như thay đổi hành vi của hàm. Bạn định nghĩa các phương thức đặc biệt tương ứng của chúng trong lớp của mình và các toán tử hoạt động theo hành vi được xác định trong các phương thức này
Chúng khác với các phương thức đặc biệt ở trên theo nghĩa là chúng cần chấp nhận một đối số khác trong định nghĩa ngoài
341. Hãy xem xét một vài ví dụLoại bỏ các quảng cáo
Làm cho các đối tượng của bạn có khả năng được thêm vào bằng cách sử dụng >>> class Order:
.. def __init__(self, cart, customer):
.. self.cart = list(cart)
.. self.customer = customer
...
.. def __len__(self):
.. return len(self.cart)
...
>>> order = Order(['banana', 'apple', 'mango'], 'Real Python')
>>> len(order)
3
6
361. Python đã ngầm xử lý bài tập cho bạn. Điều này có thể dẫn đến hành vi đáng ngạc nhiên nếu bạn quên trả lại thứ gì đó trong quá trình triển khai của mình
358 và các loại khác khi làm việc với các loại không thay đổiLoại bỏ các quảng cáo
Lập chỉ mục và cắt các đối tượng của bạn bằng cách sử dụng >>> class Order:
.. def __init__(self, cart, customer):
.. self.cart = list(cart)
.. self.customer = customer
...
.. def __len__(self):
.. return len(self.cart)
...
>>> order = Order(['banana', 'apple', 'mango'], 'Real Python')
>>> len(order)
3
53
53 được gọi là toán tử lập chỉ mục và được sử dụng trong nhiều ngữ cảnh khác nhau trong Python, chẳng hạn như lấy giá trị tại một chỉ mục theo trình tự, lấy giá trị được liên kết với một khóa trong từ điển hoặc lấy một phần của chuỗi thông qua việc cắt. Bạn có thể thay đổi hành vi của nó bằng phương pháp đặc biệt
701. Điều này là do đối số có thể có ba hình thức chủ yếu. một giá trị số nguyên, trong trường hợp đó là chỉ mục hoặc khóa từ điển, giá trị chuỗi, trong trường hợp đó là khóa từ điển và , trong trường hợp đó, nó sẽ cắt chuỗi được sử dụng bởi lớp. Mặc dù có những khả năng khác, nhưng đây là những khả năng thường gặp nhất
Vì cấu trúc dữ liệu bên trong của chúng ta là một danh sách nên chúng ta có thể sử dụng toán tử
397 trong lớp học của bạn. Miễn là bạn đang sử dụng cấu trúc dữ liệu hỗ trợ cắt (danh sách, bộ dữ liệu, chuỗi, v.v.), bạn có thể định cấu hình các đối tượng của mình để trực tiếp cắt cấu trúc
355 và tương tự cho phép bạn sử dụng các toán tử khi đối tượng lớp của bạn là toán hạng bên trái, toán tử sẽ không hoạt động nếu đối tượng lớp là toán hạng bên phải
Nếu lớp của bạn đại diện cho một thực thể toán học như vectơ, tọa độ hoặc số phức, thì việc áp dụng các toán tử sẽ hoạt động trong cả hai trường hợp vì đây là một phép toán hợp lệ
Hơn nữa, nếu các toán tử chỉ hoạt động khi thể hiện là toán hạng bên trái, chúng ta đang vi phạm nguyên tắc cơ bản của tính giao hoán trong nhiều trường hợp. Do đó, để giúp bạn làm cho các lớp của mình chính xác về mặt toán học, Python cung cấp cho bạn các phương thức đảo ngược đặc biệt như
50 và các phương thức khác, các phương thức đảo ngược đặc biệt này sẽ trả về một thể hiện mới của lớp với các thay đổi của thao tác thay vì sửa đổi chính thể hiện đang gọi
334 theo cách nó sẽ thêm một thứ gì đó ở phía trước giỏ hàng. Điều này có thể được sử dụng trong trường hợp giỏ hàng được sắp xếp theo mức độ ưu tiên của các đơn đặt hàng
729 không phải là một phương thức đặc biệt mà là một thuộc tính lớp được mặc định. Nó có một tham chiếu đến lớp. Bằng cách sử dụng nó ở đây, chúng tôi có được điều đó và sau đó gọi hàm tạo theo cách thông thường. Nói cách khác, điều này tương đương với
730. Điều này được thực hiện ở đây để tránh cấu trúc lại mã nếu tên của lớp thay đổi vào một ngày nào đó
Tiếp theo, chúng tôi định cấu hình
>>> classOrder:.. def__init__(self,cart,customer):.. self.cart=list(cart).. self.customer=customer...>>> order=Order(['banana','apple','mango'],'Real Python')>>> len(order)# Calling len when no __len__Traceback (most recent call last):
File "<stdin>", line 1, in <module>TypeError: object of type 'Order' has no len()
>>> classOrder:.. def__init__(self,cart,customer):.. self.cart=list(cart).. self.customer=customer...>>> order=Order(['banana','apple','mango'],'Real Python')>>> len(order)# Calling len when no __len__Traceback (most recent call last):
File "<stdin>", line 1, in <module>TypeError: object of type 'Order' has no len()
0, it will increment only the real part (since any real number,
757. Hai số phức được gọi là bằng nhau nếu phần thực và phần ảo tương ứng của chúng bằng nhau. Chúng được cho là không bằng nhau khi một trong hai cái này không bằng nhau
Ghi chú. Hướng dẫn dấu phẩy động là một bài viết nói về việc so sánh số float và độ chính xác của dấu phẩy động. Nó làm nổi bật những cảnh báo liên quan đến việc so sánh số float một cách trực tiếp, đó là điều chúng tôi đang làm ở đây
Cũng có thể nâng một số phức lên bất kỳ lũy thừa nào bằng công thức đơn giản. Chúng tôi định cấu hình hành vi cho cả toán tử
Ghi chú. Hãy xem kỹ định nghĩa của phương pháp. Chúng tôi đang gọi
>>> classOrder:.. def__init__(self,cart,customer):.. self.cart=list(cart).. self.customer=customer...>>> order=Order(['banana','apple','mango'],'Real Python')>>> len(order)# Calling len when no __len__Traceback (most recent call last):
File "<stdin>", line 1, in <module>TypeError: object of type 'Order' has no len()
00 để lấy mô đun của số phức. Vì vậy, khi bạn đã xác định phương thức đặc biệt cho một hàm hoặc toán tử cụ thể trong lớp của mình, nó có thể được sử dụng trong các phương thức khác của cùng một lớp
Hãy tạo hai thể hiện của lớp này, một thể hiện có phần ảo dương và một thể hiện có phần ảo âm
Như bạn có thể thấy, các đối tượng của lớp tùy chỉnh của chúng ta hoạt động và trông giống như các đối tượng của lớp dựng sẵn và rất Pythonic. Mã ví dụ đầy đủ cho lớp này được nhúng bên dưới
Trong hướng dẫn này, bạn đã tìm hiểu về Mô hình dữ liệu Python và cách Mô hình dữ liệu có thể được sử dụng để xây dựng các lớp Pythonic. Bạn đã tìm hiểu về cách thay đổi hành vi của các hàm tích hợp như
>>> classOrder:.. def__init__(self,cart,customer):.. self.cart=list(cart).. self.customer=customer...>>> order=Order(['banana','apple','mango'],'Real Python')>>> len(order)# Calling len when no __len__Traceback (most recent call last):
File "<stdin>", line 1, in <module>TypeError: object of type 'Order' has no len()
1,
>>> classOrder:.. def__init__(self,cart,customer):.. self.cart=list(cart).. self.customer=customer...>>> order=Order(['banana','apple','mango'],'Real Python')>>> len(order)# Calling len when no __len__Traceback (most recent call last):
File "<stdin>", line 1, in <module>TypeError: object of type 'Order' has no len()
00,
>>> classOrder:.. def__init__(self,cart,customer):.. self.cart=list(cart).. self.customer=customer...>>> order=Order(['banana','apple','mango'],'Real Python')>>> len(order)# Calling len when no __len__Traceback (most recent call last):
File "<stdin>", line 1, in <module>TypeError: object of type 'Order' has no len()
Tiền thưởng miễn phí. Nhấp vào đây để có quyền truy cập vào Bảng cheat Python OOP miễn phí chỉ cho bạn các hướng dẫn, video và sách hay nhất để tìm hiểu thêm về Lập trình hướng đối tượng với Python
Sau khi đọc phần này, bạn có thể tự tin tạo các lớp sử dụng các tính năng thành ngữ tốt nhất của Python và biến các đối tượng của bạn thành Pythonic
Để biết thêm thông tin về Mô hình Dữ liệu cũng như quá tải hàm và toán tử, hãy xem các tài nguyên này
của phần Mô hình dữ liệu trong tài liệu Python
Thông thạo Python của Luciano Ramalho
Thủ thuật Python. Quyển sách
Đánh dấu là đã hoàn thành
🐍 Thủ thuật Python 💌
Nhận một Thủ thuật Python ngắn và hấp dẫn được gửi đến hộp thư đến của bạn vài ngày một lần. Không có thư rác bao giờ. Hủy đăng ký bất cứ lúc nào. Được quản lý bởi nhóm Real Python
Gửi cho tôi thủ thuật Python »
Về Malay Agarwal
Một người đam mê công nghệ với đầu óc triết học và một bàn tay có thể cầm bút
» Tìm hiểu thêm về tiếng Mã Lai
Mỗi hướng dẫn tại Real Python được tạo bởi một nhóm các nhà phát triển để nó đáp ứng các tiêu chuẩn chất lượng cao của chúng tôi. Các thành viên trong nhóm đã làm việc trong hướng dẫn này là
David
Đan
Geir Arne
Joanna
Bậc thầy Kỹ năng Python trong thế giới thực Với quyền truy cập không giới hạn vào Python thực
Tham gia với chúng tôi và có quyền truy cập vào hàng nghìn hướng dẫn, khóa học video thực hành và cộng đồng các Pythonistas chuyên gia
Nâng cao kỹ năng Python của bạn »
Bậc thầy Kỹ năng Python trong thế giới thực Với quyền truy cập không giới hạn vào Python thực
Tham gia với chúng tôi và có quyền truy cập vào hàng ngàn hướng dẫn, khóa học video thực hành và cộng đồng Pythonistas chuyên gia
Nâng cao kỹ năng Python của bạn »
Bạn nghĩ sao?
Đánh giá bài viết này
Tweet Chia sẻ Chia sẻ Email
Bài học số 1 hoặc điều yêu thích mà bạn đã học được là gì?
Mẹo bình luận. Những nhận xét hữu ích nhất là những nhận xét được viết với mục đích học hỏi hoặc giúp đỡ các sinh viên khác. và nhận câu trả lời cho các câu hỏi phổ biến trong cổng thông tin hỗ trợ của chúng tôi
Điều nào sau đây không đúng về nạp chồng toán tử?
8. Phát biểu nào sau đây KHÔNG hợp lệ về nạp chồng toán tử? . Toán tử quá tải không được có ít nhất một toán hạng thuộc loại lớp của nó .
Điều nào sau đây là đúng về nạp chồng toán tử?
9. Phát biểu nào đúng về nạp chồng toán tử? . Cả toán tử số học và phi số học đều có thể bị quá tải . Thứ tự ưu tiên và tính kết hợp của các toán tử vẫn giữ nguyên sau và trước quá tải toán tử.
Toán tử nào sau đây không thể được nạp chồng trong Python?
Python không chỉ giới hạn nạp chồng toán tử cho các toán tử số học. Chúng ta cũng có thể quá tải các toán tử so sánh
Phát biểu nào sai về phương thức nạp chồng toán tử?
Các toán tử nạp chồng không thể thay đổi mức độ ưu tiên và tính kết hợp của các toán tử .