Tin tức và phân tích của tất cả các thiết bị di động

Các phương thức ma thuật trong python là gì và cách sử dụng chúng

Một trong những tính năng ít được biết đến nhưng có giá trị của Python là khả năng triển khai các phương thức ma thuật trên các đối tượng. Bằng cách sử dụng các phương pháp kỳ diệu, chúng ta có thể viết mã sạch hơn, trực quan và dễ hiểu hơn.

Với các phương thức ma thuật, chúng ta có thể tạo giao diện để tương tác với các đối tượng theo cách giống Python hơn. Bài viết này sẽ giới thiệu cho bạn các phương pháp ma thuật, thảo luận về các phương pháp thực hành tốt nhất để tạo ra chúng và khám phá các phương pháp ma thuật phổ biến mà bạn sẽ gặp.

Phương pháp kỳ diệu là gì?

Các phương thức ma thuật là các phương thức Python xác định hành vi của các đối tượng Python khi thực hiện các thao tác thông thường trên chúng. Các phương thức này được xác định rõ ràng bằng dấu gạch dưới kép trước và sau tên phương thức.

Kết quả là, chúng thường được gọi là các phương thức dunder, như trong dấu gạch dưới kép. Một phương thức phổ biến mà bạn có thể đã gặp là phương thức __init__() được sử dụng để định nghĩa các hàm tạo của lớp.

Thông thường, các phương thức dunder không nên được gọi trực tiếp trong mã của bạn; đúng hơn, chúng sẽ được trình thông dịch gọi ra khi chương trình đang chạy.

Tại sao các phương pháp ma thuật lại hữu ích?

Các phương thức ma thuật là một khái niệm hữu ích trong lập trình hướng đối tượng trong Python. Bằng cách sử dụng chúng, bạn chỉ định hành vi của các loại dữ liệu tùy chỉnh khi được sử dụng với các thao tác phổ biến, tích hợp sẵn. Những hoạt động này bao gồm:

🟢 Các phép tính số học

🟢 Hoạt động so sánh

🟢 Hoạt động vòng đời

🟢 Hoạt động đại diện

Trong phần sau, chúng ta sẽ thảo luận cách triển khai các phương thức kỳ diệu xác định hành vi của ứng dụng khi được sử dụng trong tất cả các danh mục trên.

Cách xác định phương pháp ma thuật

Như đã đề cập trước đó, các phương pháp ma thuật xác định hành vi của các đối tượng. Như vậy, chúng được định nghĩa như một phần của lớp đối tượng. Vì chúng là một phần của lớp đối tượng nên chúng lấy self làm đối số đầu tiên, tham chiếu đến chính đối tượng đó.

Chúng có thể nhận thêm các đối số tùy thuộc vào cách chúng được trình thông dịch gọi ra. Chúng cũng được xác định rõ ràng bằng hai dấu gạch dưới trước và sau tên của chúng.

Thực hiện

Phần lớn những gì chúng ta đã trình bày cho đến nay có vẻ mang tính lý thuyết và trừu tượng. Trong phần này, chúng ta sẽ triển khai một lớp Hình chữ nhật đơn giản.

Lớp này sẽ có thuộc tính chiều dài và chiều rộng. Bạn có thể sử dụng phương thức __init__ để chỉ định các thuộc tính này khi tạo một phiên bản. Ngoài ra, bạn sẽ có thể so sánh các hình chữ nhật khác nhau để xem chúng bằng, nhỏ hơn hoặc lớn hơn hình chữ nhật khác bằng cách sử dụng các toán tử ==, < và >. Cuối cùng, hình chữ nhật có thể cung cấp một chuỗi biểu diễn có ý nghĩa.

Thiết lập môi trường mã hóa của bạn

Bạn sẽ cần thời gian chạy Python để làm theo hướng dẫn này. Bạn có thể sử dụng cục bộ hoặc bạn có thể sử dụng trình biên dịch python trực tuyến newsblog.pl.

Tạo một lớp hình chữ nhật

Đầu tiên, hãy bắt đầu bằng việc định nghĩa lớp Rectangle.

class Rectangle:
    pass

Tạo một phương thức xây dựng

Tiếp theo, hãy tạo phương thức kỳ diệu đầu tiên của chúng ta, phương thức xây dựng lớp. Phương thức này sẽ lấy chiều cao và chiều rộng và lưu trữ chúng dưới dạng thuộc tính trong thể hiện của lớp.

class Rectangle:
    def __init__(self, height, width):
        self.height = height
        self.width = width

Tạo một phương thức kỳ diệu để biểu diễn chuỗi

Tiếp theo, chúng ta muốn tạo một phương thức cho phép lớp của chúng ta tạo ra một chuỗi đại diện cho đối tượng mà con người có thể đọc được. Phương thức này sẽ được gọi mỗi khi chúng ta gọi str() truyền một đối tượng Rectangle làm đối số. Phương thức này cũng sẽ được gọi khi bạn gọi các hàm có đối số chuỗi, chẳng hạn như hàm print.

class Rectangle:
    def __init__(self, height, width):
        self.height = height
        self.width = width

    def __str__(self):
        return f'Rectangle({self.height}, {self.width})'

Phương thức __str__() sẽ trả về một chuỗi đại diện cho đối tượng. Trong trường hợp này, chúng ta trả về một chuỗi có định dạng Rectangle(, ), trong đó chiều cao và chiều rộng là kích thước đã lưu của hình chữ nhật.

Tạo các phương thức kỳ diệu cho các hoạt động so sánh

Tiếp theo, chúng ta muốn tạo các toán tử so sánh cho các phép tính bằng, nhỏ hơn và lớn hơn. Điều này được gọi là quá tải toán tử. Để tạo chúng, chúng tôi sử dụng các phương thức ma thuật __eq__, __lt__ và __gt__ tương ứng. Các phương thức này sẽ trả về giá trị boolean sau khi so sánh diện tích của hình chữ nhật.

class Rectangle:
    def __init__(self, height, width):
        self.height = height
        self.width = width

    def __str__(self):
        return f'Rectangle({self.height}, {self.width})'

    def __eq__(self, other):
        """ Checking for equality """
        return self.height * self.width == other.height * other.width

    def __lt__(self, other):
        """ Checking if the rectangle is less than the other one """
        return self.height * self.width < other.height * other.width

    def __gt__(self, other):
        """ Checking if the rectage is greater than the other one """
        return self.height * self.width > other.height * other.width

Như bạn có thể thấy, các phương thức này có hai tham số. Đầu tiên là hình chữ nhật hiện tại và thứ hai là một giá trị khác được so sánh với nó. Giá trị này có thể là một phiên bản Hình chữ nhật khác hoặc bất kỳ giá trị nào khác. Logic về cách so sánh và các điều kiện mà phép so sánh trả về một giá trị hoàn toàn phụ thuộc vào bạn.

Các phương pháp ma thuật thông thường

Trong phần tiếp theo, chúng tôi sẽ đề cập đến các phương pháp ma thuật phổ biến mà bạn sẽ gặp và sử dụng.

# 1. Các phép tính toán học

Các phương thức số học kỳ diệu được gọi khi một thể hiện của lớp của bạn được đặt ở bên trái dấu số học. Phương thức này sẽ được gọi với hai đối số, đối số đầu tiên sẽ là tham chiếu đến thể hiện. Giá trị thứ hai là đối tượng ở bên phải ký tự. Các phương thức và ký tự như sau:

NameMethodSignDescriptionAddition__add__+Thực hiện phép cộng. Phép trừ__sub__–Thực hiện phép trừ.Nhân__mul__*Thực hiện phép nhânChia__div__/Thực hiện phép chia.Phân chia tầng__floordiv__//Thực hiện phép chia tầng.

#2. Hoạt động so sánh

Giống như các phương thức số học kỳ diệu, các phương thức này được gọi khi thể hiện của lớp mà chúng được định nghĩa nằm ở phía bên trái của toán tử so sánh. Ngoài ra, giống như các phương pháp số học kỳ diệu, chúng được gọi với hai tham số; đầu tiên là một tham chiếu đến một thể hiện đối tượng. Thứ hai là tham chiếu đến giá trị ở bên phải ký tự.

NameMethodSignDescriptionLess than__lt__Thực hiện lớn hơn so sánhBằng với__eq__==Thực hiện so sánh bằng Nhỏ hơn hoặc bằng__le__>=Thực hiện nhỏ hơn hoặc bằng so sánhLớn hơn hoặc bằng__ge__<=Thực hiện so sánh lớn hơn hoặc bằng

#3. Hoạt động vòng đời

Các phương thức này sẽ được gọi để đáp ứng với các phương thức vòng đời đối tượng khác nhau như khởi tạo hoặc xóa. Hàm tạo __init__ thuộc loại này. Các phương pháp phổ biến trong danh mục này được liệt kê trong bảng dưới đây:

NameMethodDescriptionConstructor__init__Phương thức này được gọi mỗi khi một đối tượng của lớp được định nghĩa bị xóa. Bạn có thể sử dụng nó để thực hiện các công việc quản lý, chẳng hạn như đóng bất kỳ tập tin nào nó đã mở.Deletion__del__ Phương thức này được gọi bất cứ khi nào một đối tượng của lớp mà nó được định nghĩa bị xóa. Nó có thể được sử dụng để thực hiện các công việc dọn dẹp như đóng tất cả các tệp đang mở. New__new__ Phương thức __new__ được gọi đầu tiên khi một đối tượng của lớp được chỉ định được tạo. Phương thức này được gọi trước hàm tạo và nhận lớp cũng như bất kỳ đối số bổ sung nào. Trả về một thể hiện của một lớp. Trong hầu hết các phần, nó không hữu ích lắm nhưng nó sẽ được đề cập chi tiết ở đây.

#4. Hoạt động đại diện

NameMethodDescriptionStr__str__Trả về một chuỗi biểu diễn đối tượng mà con người có thể đọc được. Phương thức này được gọi khi bạn gọi str(), truyền một thể hiện của một lớp làm đối số. Nó cũng được gọi khi bạn truyền một thể hiện cho các hàm print() và format(). Nó nhằm mục đích cung cấp một chuỗi mà người dùng cuối của ứng dụng có thể hiểu được Repr__repr__ Trả về một chuỗi đại diện cho đối tượng được nhà phát triển sử dụng. Lý tưởng nhất là chuỗi trả về phải chứa nhiều thông tin để bạn có thể xây dựng một phiên bản đối tượng giống hệt chỉ từ chuỗi đó.

Các phương pháp hay nhất để tạo ra các phương pháp ma thuật

Các phương pháp kỳ diệu thật tuyệt vời và sẽ đơn giản hóa mã của bạn. Tuy nhiên, hãy ghi nhớ những điều sau khi sử dụng chúng.

  • Sử dụng chúng một cách tiết kiệm – việc triển khai quá nhiều phương thức ma thuật trong các lớp của bạn sẽ khiến mã của bạn khó hiểu. Hãy giới hạn bản thân chỉ với những thứ cần thiết.
  • Đảm bảo rằng bạn hiểu ý nghĩa về hiệu suất của các phương pháp như __setatrr__ và __getattr__ trước khi sử dụng.
  • Ghi lại hành vi của các phương pháp kỳ diệu của bạn để các nhà phát triển khác có thể biết chính xác những gì họ đang làm. Điều này giúp họ dễ dàng sử dụng và gỡ lỗi hơn nếu cần.

những từ cuối

Trong bài viết này, tôi đã giới thiệu các phương thức ma thuật như một cách để tạo các lớp có thể được sử dụng với các thao tác tích hợp sẵn. Tôi cũng thảo luận về cách định nghĩa chúng và thảo luận về một ví dụ về một lớp triển khai các phương pháp ma thuật. Tiếp theo, tôi đã đề cập đến các phương pháp khác nhau mà bạn có thể sẽ sử dụng và cần trước khi chia sẻ một số phương pháp hay nhất cần ghi nhớ.

Sau đó, bạn có thể muốn tìm hiểu cách triển khai lớp Counter trong Python.