Các phương thức ma thuật trong python là gì?

Các phương thức ma thuật là các phương thức đặc biệt mà bạn có thể định nghĩa để thêm 'ma thuật' vào các lớp của mình. Chúng luôn được bao quanh bởi hai dấu gạch dưới, ví dụ: các phương thức ma thuật __init__ và __str__. Các phương thức ma thuật có thể làm phong phú thiết kế lớp của chúng ta bằng cách cấp cho chúng ta quyền truy cập vào các tính năng cú pháp tích hợp sẵn của Python

Python cho phép các lớp của chúng tôi kế thừa từ các lớp dựng sẵn. Lớp con kế thừa của lớp dựng sẵn chia sẻ tất cả các thuộc tính giống nhau, bao gồm các phương thức như lớp dựng sẵn. Chúng ta có thể tận dụng chức năng cốt lõi được tích hợp sẵn, nhưng tùy chỉnh các thao tác đã chọn thông qua việc sử dụng các phương pháp kỳ diệu

Trong hướng dẫn này, tôi sẽ kết hợp hai ý tưởng này lại với nhau để giới thiệu cách chúng ta có thể kế thừa từ lớp danh sách dựng sẵn và sử dụng các phương thức kỳ diệu trong thiết kế lớp của chúng ta. Tôi sẽ sửa đổi ba phương thức ma thuật kiểm soát việc lập chỉ mục danh sách. Bằng cách kết hợp cả hai tính năng này, một lớp rất đơn giản để sử dụng có thể được xây dựng và chúng ta có thể thêm hành vi vào các phương thức mà chúng ta mong muốn. Hành vi tích hợp quen thuộc với tất cả các nhà phát triển Python;

Cuối cùng, hai ví dụ rộng hơn minh họa cách sử dụng các phương pháp ma thuật trong các hoạt động phát sóng và thay đổi trạng thái của một cá thể sẽ được trình bày. Tất cả mã đi kèm đều có sẵn thông qua GitHub

ví dụ 1. lập chỉ mục danh sách

Các phương thức ma thuật có thể được thao tác để sửa đổi chỉ mục danh sách. Lớp MyCustomList, kế thừa từ kiểu danh sách có sẵn. Điều này có nghĩa là bất kỳ đối tượng nào được tạo thông qua lớp MyCustomList sẽ hoạt động giống như một danh sách, ngoại trừ ở những nơi chúng tôi chọn tùy chỉnh có chọn lọc các phương thức

getitem, setitem và delitem là các phương thức ma thuật được gọi khi chúng ta truy cập chỉ mục danh sách. Hành vi của các phương pháp ma thuật này có thể được sửa đổi

Trong ví dụ được hiển thị bên dưới, chúng tôi đang loại bỏ ý tưởng lập chỉ mục danh sách bắt đầu từ chỉ mục thứ 0. Nếu người dùng cố gắng truy cập một phần tử từ danh sách của chúng tôi bằng cách sử dụng chỉ mục zeroth, một ngoại lệ ValueError sẽ được đưa ra và chương trình sẽ kết thúc. Nếu người dùng nhập chỉ mục danh sách lớn hơn một, thì các phương thức sẽ giảm chỉ mục xuống một, sau đó gọi danh sách lớp cha có chỉ mục

Để giới thiệu cách sử dụng các phương thức được xác định trong lớp MyCustomList này, hãy xem bên dưới trong lời nhắc tương tác Python

Ví dụ cho thấy cách getitem, setitem và delitem có thể được gọi. Phương pháp ma thuật có thể được gọi ngầm. Đối với __getitem__, để truy cập chỉ mục đầu tiên, chỉ cần viết tên của đối tượng theo sau là vị trí chỉ mục trong dấu ngoặc vuông

Điều thú vị nhất là khi chúng ta yêu cầu phần tử ở vị trí chỉ số 1, giá trị số nguyên 1 được trả về, mặc dù 1 là phần tử thứ 0. Những gì chúng tôi có ở đây là một danh sách bắt đầu lập chỉ mục bắt đầu từ 1. Trên thực tế, nó đang bù đắp cho sự nhầm lẫn mà tất cả chúng ta đều gặp phải khi lần đầu tiên học lập chỉ mục danh sách.

Bây giờ, hãy thay đổi giá trị số nguyên 1 trong danh sách thành 100. Để làm điều này, chúng ta cần gọi setitem. Để làm điều này, chúng ta chỉ cần viết tên của đối tượng, theo sau là dấu ngoặc vuông và một phép gán. Một lần nữa, để thay đổi phần tử đầu tiên trong danh sách, chúng tôi sử dụng vị trí chỉ số 1. Khi chúng ta xuất lại danh sách, chúng ta có thể thấy rõ rằng phần tử đầu tiên đã thay đổi từ 1 thành 100

Cuối cùng, để xóa một phần tử khỏi danh sách __delitem__ có thể được xác định. Phương thức ma thuật __delitem__ được gọi, khi chúng ta sử dụng từ khóa del python để giải quyết cuộc gọi phương thức __delitem__. Để xây dựng thêm ví dụ lập chỉ mục danh sách của chúng tôi, hãy xóa phần tử đầu tiên trong chỉ mục, giá trị số nguyên 100. Khi chúng ta gọi del, theo sau là đối tượng và vị trí chỉ mục của phần tử mà chúng ta muốn xóa, trong ví dụ này, phần tử đầu tiên trong danh sách 100, bây giờ chúng ta có thể thấy rằng 100 trên thực tế đã bị xóa

Các phương pháp kỳ diệu mang đến cơ hội sửa đổi hành vi mặc định. Trên hết, không cần phải tìm hiểu tên phương thức mới hoặc giao diện mới, vì vậy các phương thức có thể được thực hiện một cách trực quan. Hướng dẫn sử dụng các phương thức ma thuật này được triển khai trong MyCustomList được chỉ định trong bảng bên dưới

Cách gọi các phương thức ma thuật, getitem, setitem và delitem

ví dụ 2. Phương pháp ma thuật __mul__

Chúng ta cũng có thể sử dụng toán tử nhân trong thiết kế lớp của mình. Vì chúng tôi kế thừa từ lớp danh sách dựng sẵn, nên chúng tôi có thể nén hai đối tượng MyCustomList lại với nhau [vì chúng hoạt động giống như đối tượng danh sách] và lặp qua đối tượng zip. Trong quá trình lặp lại, chúng ta có thể nhân các phần tử trong mỗi danh sách với phần tử tương ứng của nó trong danh sách khác theo kiểu quảng bá [xem đoạn mã phương thức ma thuật __mul__ bên dưới]. Hành vi phát sóng này tương tự như hành vi được tìm thấy trong các gói phân tích dữ liệu như Pandas và Numpy

Ví dụ cho thấy rằng chúng ta có thể ghép hai đối tượng MyCustomList lại với nhau bằng cách sử dụng dấu *. Nếu chúng ta nắm bắt giá trị được trả về trong một biến có tên list_three và in list_three, một danh sách mới sẽ được xuất ra. Danh sách này là sản phẩm của việc nhân các phần tử với nhau từ 2 danh sách khác

__mul__ là một phương thức từ lớp MyCustomList. Ở đây, nó được hiển thị trong sự cô lập

Toán tử nhân * phân giải thành lệnh gọi phương thức ma thuật __mul__, mà chúng ta có thể tùy chỉnh để trả về hành vi mà chúng ta mong muốn

Toàn bộ mã nguồn cho lớp được sử dụng trong ví dụ này, MyCustomList được hiển thị bên dưới

Tiền thưởng ví dụ. Phương pháp ma thuật __call__

Để kết thúc, tôi sẽ minh họa cách gọi phương thức ma thuật __call__ trong Python. __call__ có thể đặc biệt hữu ích trong các lớp có các thể hiện cần thường xuyên thay đổi trạng thái của chúng. "Gọi" thể hiện có thể là một cách trực quan và tao nhã để thay đổi trạng thái của đối tượng

Xem xét ví dụ hiển thị. Ở đây, lớp MyClass có một hàm tạo init dự kiến ​​ba đối số được truyền. Ba đối số này có thể được truyền trong chữ ký phương thức init và được gán làm thuộc tính trong đối tượng

Phương thức gọi phép thuật rất hữu ích khi chúng ta muốn thay đổi trạng thái của một thể hiện mà không thực sự tạo một thể hiện mới

Khi phiên bản được khởi tạo lần đầu tiên, tôi chuyển vào các số nguyên 1, 2 và 3, được gán lần lượt là các thuộc tính var_1, var_2 và var_3 trong phiên bản. Khi tôi sử dụng câu lệnh in để hiển thị đầu ra của thể hiện, obj, bằng cách sử dụng thuộc tính __dict__, tôi có thể thấy rằng var_1 được gán giá trị 1, var_2 được gán giá trị 2 và var_3 được gán giá trị 3

Bây giờ, hãy đề xuất rằng tôi muốn thay đổi các giá trị thuộc tính var_1 và var_2 của phiên bản này, trong khi vẫn giữ thuộc tính var_3 như khi phiên bản được tạo ban đầu

Để làm điều này là đơn giản. Tôi xác định một phương thức gọi ma thuật, cho phép xác định lại các thuộc tính var_1 và var_2. Các phương thức ma thuật có thể được gọi ngầm, có nghĩa là tôi chỉ cần gọi obj[200, 300] và phương thức gọi sẽ được gọi. Tất nhiên, cũng có thể gọi phương thức gọi một cách rõ ràng, e. g. đối tượng. __call__[200, 300], nhưng phương pháp đầu tiên có vẻ trực quan hơn. Cuối cùng, với mục đích trình diễn, tôi đã in id của cá thể để hiển thị chắc chắn rằng chúng ta đã thao tác với cùng một đối tượng

Phương thức gọi có thể được định nghĩa theo hai cách. Các đối số có thể được chuyển trực tiếp vào chữ ký phương thức gọi. Ngoài ra, có thể sử dụng đối số *vars để nắm bắt tất cả các đối số được truyền và lưu trữ chúng trong một bộ, có thể được giải nén như minh họa ở trên

Mã nguồn cho ví dụ này có thể được tìm thấy dưới đây

Tóm lược

Các phương thức ma thuật có thể làm phong phú thêm thiết kế lớp của chúng ta bằng cách cho phép chúng ta truy cập vào các tính năng cú pháp cốt lõi. Trong các ví dụ đầu tiên, chúng ta có cả hai thế giới tốt nhất. Chúng ta có thể kế thừa từ lớp danh sách dựng sẵn và sửa đổi các phương thức cụ thể trong lớp đó để tùy chỉnh hành vi. getitem, setitem và delitem đều đã được sửa đổi, nhưng thông qua kế thừa, chúng tôi vẫn có thể sử dụng các phương thức init và repr[] tích hợp sẵn của danh sách chẳng hạn

Chúng tôi có thể giao tiếp việc sử dụng các đối tượng cực kỳ dễ dàng với các nhà phát triển đồng nghiệp. Trong ví dụ được cung cấp, tất cả những gì chúng ta cần nói với các nhà phát triển đồng nghiệp của mình là lớp của chúng ta hoạt động giống như một danh sách, chỉ khác một chút, ở đây chúng ta loại bỏ ý tưởng về chỉ mục thứ không. Không cần phải học tên phương thức mới hoặc giao diện mới

Ngoài ra, phương pháp gọi ma thuật đã được chứng minh. Gọi thể hiện có thể là một cách trực quan và tao nhã để thay đổi trạng thái của đối tượng

Phương pháp ma thuật là gì?

Các phương thức ma thuật là các phương thức đặc biệt ghi đè hành động mặc định của PHP khi một số hành động nhất định được thực hiện trên một đối tượng . thận trọng. Tất cả các tên phương thức bắt đầu bằng __ được dành riêng bởi PHP. Do đó, không nên sử dụng các tên phương thức như vậy trừ khi ghi đè hành vi của PHP.

phương pháp ma thuật giải thích với ví dụ là gì?

Các phương thức ma thuật là các phương thức đặc biệt mà bạn có thể định nghĩa để thêm 'ma thuật' vào các lớp của mình . Chúng luôn được bao quanh bởi hai dấu gạch dưới, ví dụ: các phương thức ma thuật __init__ và __str__. Các phương thức ma thuật có thể làm phong phú thêm thiết kế lớp của chúng ta bằng cách cấp cho chúng ta quyền truy cập vào các tính năng cú pháp tích hợp sẵn của Python.

Các phương thức đặc biệt trong Python là gì?

Trong Python, các phương thức đặc biệt là tập hợp các phương thức được xác định trước mà bạn có thể sử dụng để làm phong phú các lớp của mình . Chúng rất dễ nhận ra vì chúng bắt đầu và kết thúc bằng hai dấu gạch dưới, ví dụ __init__ hoặc __str__.

Mục đích của phương pháp ma thuật __ init __ Python là gì?

Phương thức __init__ để khởi tạo được gọi mà không có bất kỳ lệnh gọi nào, khi một thể hiện của một lớp được tạo , giống như hàm tạo trong một số ngôn ngữ lập trình khác . Các phương thức này là lý do chúng ta có thể thêm hai chuỗi với toán tử '+' mà không cần bất kỳ kiểu chữ rõ ràng nào.

Chủ Đề