Cái gọi là phương pháp ma thuật không liên quan gì đến ma thuật. Bạn đã thấy chúng trong các chương trước của hướng dẫn của chúng tôi. Chúng là những phương thức đặc biệt với tên cố định. Chúng là những phương thức với cú pháp vụng về này, tôi. e. dấu gạch dưới kép ở đầu và cuối. Họ cũng khó nói về. Làm thế nào để bạn phát âm hoặc nói một tên phương thức như
12.84? . "Dấu gạch dưới kép init dấu gạch dưới kép" tốt hơn nhiều, nhưng cách lý tưởng là "dunder init dunder" Đó là lý do tại sao các phương thức ma thuật đôi khi được gọi là phương thức dunder
Vì vậy, điều kỳ diệu về phương pháp
12.84 là gì? . Lời kêu gọi được thực hiện đằng sau hậu trường. Khi bạn tạo một thể hiện x của một lớp A với câu lệnh "x = A[]", Python sẽ thực hiện các lệnh gọi cần thiết tới
12.86 và
12.84
Ở phần cuối của chương hướng dẫn này, chúng tôi sẽ giới thiệu phương pháp
12.88. Nó bị bỏ qua bởi nhiều người mới bắt đầu và thậm chí cả những lập trình viên cao cấp của Python. Đây là một chức năng mà nhiều ngôn ngữ lập trình không có, vì vậy các lập trình viên thường không tìm kiếm nó. Phương thức
12.88 cho phép các lập trình viên Python viết các lớp trong đó các thể hiện hoạt động giống như các hàm. Cả hai chức năng và các thể hiện của các lớp như vậy được gọi là có thể gọi được
Chúng ta đã gặp khái niệm nạp chồng toán tử nhiều lần trong hướng dẫn này. Chúng tôi đã sử dụng dấu cộng để thêm các giá trị số, để nối các chuỗi hoặc kết hợp các danh sách
4 + 5
ĐẦU RA
9
________số 8
ĐẦU RA
12.8
12.80
ĐẦU RA
12.81
12.82
ĐẦU RA
12.83
Thậm chí có thể quá tải toán tử "+" cũng như tất cả các toán tử khác cho mục đích của lớp của riêng bạn. Để làm điều này, bạn cần hiểu cơ chế cơ bản. Có một phương pháp đặc biệt [hoặc một "ma thuật"] cho mọi ký hiệu toán tử. Phương pháp kỳ diệu cho dấu "+" là phương pháp
12.800. Đối với "-" nó là
12.801, v.v. Chúng tôi có một danh sách đầy đủ tất cả các phương pháp ma thuật ở xa hơn một chút
Cơ chế hoạt động như thế này. Nếu chúng ta có biểu thức "x + y" và x là một thể hiện của lớp K, thì Python sẽ kiểm tra định nghĩa lớp của K. Nếu K có phương thức
12.800 thì nó sẽ được gọi với
12.803, nếu không chúng ta sẽ nhận được thông báo lỗi
12.88
Đào tạo Python trực tiếp
Thưởng thức trang này?
Nhìn thấy. Tổng quan về các khóa học Python trực tiếp
đăng ký tại đây
Tổng quan về các phương pháp ma thuật
toán tử nhị phân
OperatorMethod+object.__add__[self, other]-object.__sub__[self, other]*object.__mul__[self, other]//object.__floordiv__[self, other]/object.__truediv__[self, other]%object.__mod__[self, other]**object.__pow__[self, other[, modulo]]object.__rshift__[self, other]&object.__and__[self, other]^object.__xor__[self, other]|object.__or__[self, other]Bài tập mở rộng
OperatorMethod+=object.__iadd__[self, other]-=object.__isub__[self, other]*=object.__imul__[self, other]/=object.__idiv__[self, other]//=object.__ifloordiv__[self, other]%=object.__imod__[self, other]**=object.__ipow__[self, other[, modulo]]=object.__irshift__[self, other]&=object.__iand__[self, other]^=object.__ixor__[self, other]|=object.__ior__[self, other]toán tử đơn nguyên
Toán tửMethod-object. __neg__[bản thân]+đối tượng. đối tượng __pos__[self]abs[]. __abs__[bản thân]~đối tượng. đối tượng __invert__[self]complex[]. đối tượng __complex__[self]int[]. đối tượng __int__[self]long[]. đối tượng __long__[self]float[]. đối tượng __float__[self]oct[]. đối tượng __oct__[self]hex[]. __hex__[tựToán tử so sánh
OperatorMethodobject.__gt__[self, other]lớp ví dụ. Chiều dài
Chúng tôi sẽ trình bày lớp Độ dài và cách bạn có thể nạp chồng toán tử "+" cho lớp của riêng bạn. Để làm điều này, chúng ta phải quá tải phương thức
12.800. Lớp của chúng tôi cũng chứa các phương thức
12.805 và
12.806. Các thể hiện của lớp Độ dài chứa thông tin về độ dài hoặc khoảng cách. Các thuộc tính của một thể hiện là tự. giá trị và bản thân. đơn vị
Lớp này cho phép chúng ta tính toán các biểu thức với các đơn vị hỗn hợp như thế này
12.82
Lớp học có thể được sử dụng như thế này
90
ĐẦU RA
91
Danh sách của lớp
92
ĐẦU RA
93
Chúng tôi sử dụng phương pháp
12.807 để thực hiện phép gán mở rộng
94
Bây giờ chúng tôi có khả năng viết các bài tập sau
95
Chúng tôi đã thêm 1 mét vào ví dụ trên bằng cách viết "x += Chiều dài[1]]". Chắc chắn, bạn sẽ đồng ý với chúng tôi rằng sẽ thuận tiện hơn nếu chỉ viết "x += 1" thay vì. Chúng tôi cũng muốn xử lý các biểu thức như "Length[5,"yd"] + 4. 8" tương tự. Vì vậy, nếu ai đó sử dụng kiểu int hoặc float, lớp của chúng ta sẽ tự động lấy kiểu đó cho "mét" và chuyển đổi nó thành đối tượng Độ dài. Thật dễ dàng để điều chỉnh phương pháp
12.800 và
12.807 của chúng tôi cho nhiệm vụ này. Tất cả những gì chúng ta phải làm là kiểm tra loại tham số "khác"
96
Đặt cược an toàn là nếu ai đó làm việc với việc cộng các số nguyên và di chuyển từ phía bên phải trong một thời gian, thì người đó sẽ muốn có số nguyên tương tự từ phía bên trái. Điều gì sẽ xảy ra nếu chúng ta thực thi dòng mã sau
12.810
Chúng tôi sẽ nhận được một ngoại lệ
12.811
Tất nhiên, vế trái phải thuộc loại "Length", vì nếu không thì Python sẽ cố gắng áp dụng phương thức
12.800 từ int, phương thức này không thể đối phó với các đối tượng Độ dài làm đối số thứ hai
Python cũng cung cấp giải pháp cho vấn đề này. Đó là phương pháp
12.813. Nó hoạt động như thế này. Python cố gắng đánh giá biểu thức "5 + Độ dài [3, 'yd']". Đầu tiên nó gọi int.
12.800[5,Length[3, 'yd']], sẽ đưa ra một ngoại lệ. Sau đó, nó sẽ cố gọi Độ dài.
12.813[Chiều dài[3, "yd"], 5]. Dễ dàng nhận ra cách triển khai của
12.813 tương tự như của
12.800
97
Nên sử dụng phương pháp
12.800 trong phương pháp
12.813
98
Sơ đồ sau đây minh họa mối quan hệ giữa
12.800 và
12.813
Đào tạo Python trực tiếp
Thưởng thức trang này?
Nhìn thấy. Tổng quan về các khóa học Python trực tiếp
Các khóa học trực tuyến sắp tới
Khóa học nâng cao chuyên sâu
Lập trình hướng đối tượng với Python
đăng ký tại đây
Các lớp tiêu chuẩn như các lớp cơ sở
Có thể sử dụng các lớp tiêu chuẩn - như int, float, dict hoặc danh sách - làm lớp cơ sở.
Chúng tôi mở rộng lớp danh sách bằng cách thêm một phương thức đẩy
99
ĐẦU RA
3.8 + 90
Điều này có nghĩa là tất cả các toán tử gán mở rộng và nhị phân được giới thiệu trước đó cũng tồn tại trong phiên bản "đảo ngược".
______113 ,
12.823 ,
12.824 v.v.
bài tập
bài tập 1
Viết một lớp với tên Ccy, tương tự như lớp Length đã định nghĩa trước đó. Ccy nên chứa các giá trị bằng các loại tiền tệ khác nhau, e. g. "EUR", "GBP" hoặc "USD". Một phiên bản nên chứa số lượng và đơn vị tiền tệ. Lớp học, bạn sẽ thiết kế như một bài tập, có thể được mô tả tốt nhất với phiên ví dụ sau
3.8 + 91
Đào tạo Python trực tiếp
Thưởng thức trang này?
Nhìn thấy. Tổng quan về các khóa học Python trực tiếp
đăng ký tại đây
Giải pháp cho bài tập của chúng tôi
Giải bài tập 1
3.8 + 92
ĐẦU RA
3.8 + 93
3.8 + 94
ĐẦU RA
3.8 + 95
Một khía cạnh thú vị khác của lớp chuyển đổi tiền tệ này trong Python có thể được hiển thị, nếu chúng ta thêm phép nhân. Bạn sẽ dễ dàng hiểu rằng thật vô nghĩa khi cho phép các biểu thức như
12.825 [hoặc trong ký hiệu tiền tố. "€12. 4 đô la 3. 4"], nhưng hoàn toàn hợp lý khi đánh giá "3 4. 54 €". Bạn có thể tìm thấy lớp công cụ chuyển đổi tiền tệ mới với các phương thức mới được thêm cho
12.826,
12.827 và
12.824 trong danh sách sau
3.8 + 96
ĐẦU RA
3.8 + 97
Giả sử rằng bạn đã lưu lớp dưới tên currency_converter, bạn có thể sử dụng nó theo cách sau trong trình bao lệnh