Phương pháp ma thuật trong Python là các phương pháp đặc biệt bắt đầu và kết thúc với các dấu gạch dưới kép. Chúng cũng được gọi là phương pháp dunder. Các phương pháp ma thuật không có nghĩa là được gọi trực tiếp bởi bạn, nhưng lời cầu khẩn xảy ra trong lớp từ một hành động nhất định. Ví dụ: khi bạn thêm hai số bằng toán tử +, bên trong, phương thức Các lớp học tích hợp trong Python xác định nhiều phương pháp ma thuật. Sử dụng chức năng Như bạn có thể thấy ở trên, lớp INT bao gồm các phương pháp ma thuật khác nhau được bao quanh bởi các dấu gạch dưới kép. Ví dụ: phương thức Như bạn có thể thấy, khi bạn thực hiện __add__[]
sẽ được gọi.dir[]
để xem số lượng phương thức ma thuật được kế thừa bởi một lớp. Ví dụ, các danh sách sau đây liệt kê tất cả các thuộc tính và phương thức được xác định trong lớp int
.
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__',
'__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__',
'__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes'] __add__
là một phương thức ma thuật được gọi khi chúng ta thêm hai số bằng toán tử +. Xem xét các ví dụ sau.
>>> num + 5
15
>>> num.__add__[5]
15 num+10
, toán tử + gọi phương thức __add__[10]
. Bạn cũng có thể gọi
0 trực tiếp sẽ cho kết quả tương tự. Tuy nhiên, như đã đề cập trước đây, các phương pháp ma thuật không có nghĩa là được gọi trực tiếp, mà ở bên trong, thông qua một số phương pháp hoặc hành động khác.class Employee:
def __init__[self]:
self.name='Swati'
self.salary=10000
def __str__[self]:
return 'name='+self.name+' salary=$'+str[self.salary]
Phương pháp ma thuật thường được sử dụng nhất để xác định các hành vi quá tải của các toán tử được xác định trước trong Python. Chẳng hạn, các toán tử số học theo mặc định hoạt động trên các toán tử số. Điều này có nghĩa là các đối tượng số phải được sử dụng cùng với các toán tử như +, -, *, /, v.v. Toán tử + cũng được định nghĩa là toán tử nối trong chuỗi, danh sách và các lớp Tuple. Chúng ta có thể nói rằng toán tử + bị quá tải.
Để làm cho hành vi quá tải có sẵn trong lớp tùy chỉnh của riêng bạn, phương thức ma thuật tương ứng sẽ được ghi đè. Ví dụ: để sử dụng toán tử + với các đối tượng của lớp do người dùng xác định, nó nên bao gồm phương thức __add__[]
.
Hãy xem cách thực hiện và sử dụng một số phương pháp ma thuật quan trọng.
__new __ [] phương thức
Các ngôn ngữ như Java và C# Sử dụng toán tử mới để tạo một thể hiện mới của một lớp. Trong Python, phương pháp ma thuật
class Employee:
def __init__[self]:
self.name='Swati'
self.salary=10000
def __str__[self]:
return 'name='+self.name+' salary=$'+str[self.salary]
2 được gọi hoàn toàn trước phương thức class Employee:
def __init__[self]:
self.name='Swati'
self.salary=10000
def __str__[self]:
return 'name='+self.name+' salary=$'+str[self.salary]
3. Phương thức class Employee:
def __init__[self]:
self.name='Swati'
self.salary=10000
def __str__[self]:
return 'name='+self.name+' salary=$'+str[self.salary]
2 trả về một đối tượng mới, sau đó được khởi tạo bằng class Employee:
def __init__[self]:
self.name='Swati'
self.salary=10000
def __str__[self]:
return 'name='+self.name+' salary=$'+str[self.salary]
3.class Employee:
def __new__[cls]:
print ["__new__ magic method is called"]
inst = object.__new__[cls]
return inst
def __init__[self]:
print ["__init__ magic method is called"]
self.name='Satya'
Ví dụ trên sẽ tạo ra đầu ra sau khi bạn tạo một thể hiện của lớp
class Employee:
def __init__[self]:
self.name='Swati'
self.salary=10000
def __str__[self]:
return 'name='+self.name+' salary=$'+str[self.salary]
6. >>> emp = nhân viên [] __New__ Phương pháp ma thuật được gọi là __init__ Phương pháp ma thuật được gọi là__new__ magic method is called
__init__ magic method is called
Do đó, phương pháp
class Employee:
def __init__[self]:
self.name='Swati'
self.salary=10000
def __str__[self]:
return 'name='+self.name+' salary=$'+str[self.salary]
2 được gọi trước phương thức class Employee:
def __init__[self]:
self.name='Swati'
self.salary=10000
def __str__[self]:
return 'name='+self.name+' salary=$'+str[self.salary]
3.__STR __ [] Phương thức
Một phương pháp ma thuật hữu ích khác là
class Employee:
def __init__[self]:
self.name='Swati'
self.salary=10000
def __str__[self]:
return 'name='+self.name+' salary=$'+str[self.salary]
9. Nó được ghi đè để trả về một biểu diễn chuỗi có thể in của bất kỳ lớp do người dùng xác định. Chúng tôi đã thấy chức năng tích hợp class distance:
def __init__[self, x=None,y=None]:
self.ft=x
self.inch=y
def __add__[self,x]:
temp=distance[]
temp.ft=self.ft+x.ft
temp.inch=self.inch+x.inch
if temp.inch>=12:
temp.ft+=1
temp.inch-=12
return temp
def __str__[self]:
return 'ft:'+str[self.ft]+' in: '+str[self.inch]
0 trả về một chuỗi từ tham số đối tượng. Ví dụ: class distance:
def __init__[self, x=None,y=None]:
self.ft=x
self.inch=y
def __add__[self,x]:
temp=distance[]
temp.ft=self.ft+x.ft
temp.inch=self.inch+x.inch
if temp.inch>=12:
temp.ft+=1
temp.inch-=12
return temp
def __str__[self]:
return 'ft:'+str[self.ft]+' in: '+str[self.inch]
1 trả về '12'. Khi được gọi, nó gọi phương thức class Employee:
def __init__[self]:
self.name='Swati'
self.salary=10000
def __str__[self]:
return 'name='+self.name+' salary=$'+str[self.salary]
9 trong lớp INT. >>> num = 12 >>> str [num] '12' >>> #này tương đương với >>> int .__ str __ [num] '12'>>> str[num]
'12'
>>> #This is equivalent to
>>> int.__str__[num]
'12'
Bây giờ chúng ta hãy ghi đè phương thức
class Employee:
def __init__[self]:
self.name='Swati'
self.salary=10000
def __str__[self]:
return 'name='+self.name+' salary=$'+str[self.salary]
9 trong lớp nhân viên để trả về một đại diện chuỗi của đối tượng của nó.class Employee:
def __init__[self]:
self.name='Swati'
self.salary=10000
def __str__[self]:
return 'name='+self.name+' salary=$'+str[self.salary]
Xem cách hàm
class distance:
def __init__[self, x=None,y=None]:
self.ft=x
self.inch=y
def __add__[self,x]:
temp=distance[]
temp.ft=self.ft+x.ft
temp.inch=self.inch+x.inch
if temp.inch>=12:
temp.ft+=1
temp.inch-=12
return temp
def __str__[self]:
return 'ft:'+str[self.ft]+' in: '+str[self.inch]
0 gọi nội bộ gọi phương thức class Employee:
def __init__[self]:
self.name='Swati'
self.salary=10000
def __str__[self]:
return 'name='+self.name+' salary=$'+str[self.salary]
9 được xác định trong lớp nhân viên. Đây là lý do tại sao nó được gọi là một phương pháp ma thuật! >>> e1 = nhân viên [] >>> in [e1] name = swati lương = $ 10000>>> print[e1]
name=Swati salary=$10000
__add __ [] phương thức
Trong ví dụ sau, một lớp có tên là khoảng cách được xác định với hai thuộc tính thể hiện - ft và inch. Việc bổ sung hai đối tượng khoảng cách này được mong muốn được thực hiện bằng cách sử dụng toán tử quá tải +.
Để đạt được điều này, phương pháp ma thuật __add__[]
được ghi đè, thực hiện việc bổ sung các thuộc tính FT và inch của hai đối tượng. Phương thức
class Employee:
def __init__[self]:
self.name='Swati'
self.salary=10000
def __str__[self]:
return 'name='+self.name+' salary=$'+str[self.salary]
9 trả về biểu diễn chuỗi của đối tượng.class distance:
def __init__[self, x=None,y=None]:
self.ft=x
self.inch=y
def __add__[self,x]:
temp=distance[]
temp.ft=self.ft+x.ft
temp.inch=self.inch+x.inch
if temp.inch>=12:
temp.ft+=1
temp.inch-=12
return temp
def __str__[self]:
return 'ft:'+str[self.ft]+' in: '+str[self.inch]
Chạy tập lệnh Python ở trên để xác minh hoạt động quá tải của toán tử +.
>>> d1 = khoảng cách [3,10] >>> d2 = khoảng cách [4,4] >>> in ["d1 = {} d2 = {}". Định dạng [d1, d2]] d1 = ft: 3 Trong: 10 d2 = ft: 4 in: 4 >>> d3 = d1+d2 >>> in [d3] ft: 8 in: 2>>> d2=distance[4,4]
>>> print["d1= {} d2={}".format[d1, d2]]
d1= ft:3 in: 10 d2=ft:4 in: 4
>>> d3=d1+d2
>>> print[d3]
ft:8 in: 2
__GE __ [] Phương thức
Phương pháp sau đây được thêm vào trong lớp khoảng cách để quá tải toán tử
class distance:
def __init__[self, x=None,y=None]:
self.ft=x
self.inch=y
def __add__[self,x]:
temp=distance[]
temp.ft=self.ft+x.ft
temp.inch=self.inch+x.inch
if temp.inch>=12:
temp.ft+=1
temp.inch-=12
return temp
def __str__[self]:
return 'ft:'+str[self.ft]+' in: '+str[self.inch]
8.class distance:
def __init__[self, x=None,y=None]:
self.ft=x
self.inch=y
def __ge__[self, x]:
val1=self.ft*12+self.inch
val2=x.ft*12+x.inch
if val1>=val2:
return True
else:
return False
Phương pháp này được gọi khi toán tử
class distance:
def __init__[self, x=None,y=None]:
self.ft=x
self.inch=y
def __add__[self,x]:
temp=distance[]
temp.ft=self.ft+x.ft
temp.inch=self.inch+x.inch
if temp.inch>=12:
temp.ft+=1
temp.inch-=12
return temp
def __str__[self]:
return 'ft:'+str[self.ft]+' in: '+str[self.inch]
8 được sử dụng và trả về đúng hoặc sai. Theo đó, thông báo thích hợp có thể được hiển thị >>> d1 = khoảng cách [2,1] >>> d2 = khoảng cách [4,10] >>> d1> = d2 false>>> d2=distance[4,10]
>>> d1>=d2
False
Phương pháp ma thuật quan trọng
Các bảng sau liệt kê các phương pháp ma thuật quan trọng trong Python 3.
__new __ [CLS, khác] | Để được gọi trong một lần khởi tạo của một đối tượng. |
__init __ [bản thân, người khác] | Để được gọi bằng phương thức __new__. |
__del __ [bản thân] | Phương pháp phá hủy. |
__new __ [CLS, khác] | Để được gọi trong một lần khởi tạo của một đối tượng. |
__init __ [bản thân, người khác] | Để được gọi bằng phương thức __new__. |
__del __ [bản thân] | Phương pháp phá hủy. |
Các nhà khai thác và chức năng chưa | __pos __ [bản thân] |
Để được gọi cho tích cực đơn, ví dụ: +Một số dự án. | __neg __ [bản thân] |
Để được gọi cho tiêu cực đơn, ví dụ: -Someobject. | __abs __ [bản thân] |
Để được gọi bằng hàm abs [] tích hợp. | __invert __ [bản thân] |
Để được gọi để đảo ngược bằng toán tử ~. | __round __ [tự, n] |
__new __ [CLS, khác] | Để được gọi trong một lần khởi tạo của một đối tượng. |
__init __ [bản thân, người khác] | Để được gọi bằng phương thức __new__. |
__del __ [bản thân] | Phương pháp phá hủy. |
Các nhà khai thác và chức năng chưa | __pos __ [bản thân] |
Để được gọi cho tích cực đơn, ví dụ: +Một số dự án. | __neg __ [bản thân] |
Để được gọi cho tiêu cực đơn, ví dụ: -Someobject. | __abs __ [bản thân] |
Để được gọi bằng hàm abs [] tích hợp. | __invert __ [bản thân] |
Để được gọi để đảo ngược bằng toán tử ~. | __round __ [tự, n] |
Để được gọi bằng hàm vòng tròn []. | __floor __ [bản thân] |
Để được gọi bằng hàm toán học tích hợp.floor []. | __ceil __ [bản thân] |
Để được gọi bằng hàm toán học tích hợp []. | __trunc __ [bản thân] |
Để được gọi bằng hàm toán học tích hợp.trunc []. | Nhiệm vụ tăng cường |
__iadd __ [bản thân, người khác] | Để được gọi là bổ sung với bài tập, ví dụ: a += b. |
__new __ [CLS, khác] | Để được gọi trong một lần khởi tạo của một đối tượng. |
__init __ [bản thân, người khác] | Để được gọi bằng phương thức __new__. |
__del __ [bản thân] | Phương pháp phá hủy. |
Các nhà khai thác và chức năng chưa | __pos __ [bản thân] |
Để được gọi cho tích cực đơn, ví dụ: +Một số dự án. | __neg __ [bản thân] |
Để được gọi cho tiêu cực đơn, ví dụ: -Someobject. | __abs __ [bản thân] |
Để được gọi để đảo ngược bằng toán tử ~. | __round __ [tự, n] |
__new __ [CLS, khác] | Để được gọi trong một lần khởi tạo của một đối tượng. |
__init __ [bản thân, người khác] | Để được gọi bằng phương thức __new__. |
__del __ [bản thân] | Phương pháp phá hủy. |
Các nhà khai thác và chức năng chưa | __pos __ [bản thân] |
Để được gọi cho tích cực đơn, ví dụ: +Một số dự án. | __neg __ [bản thân] |
Để được gọi cho tiêu cực đơn, ví dụ: -Someobject. | __abs __ [bản thân] |
Để được gọi bằng hàm abs [] tích hợp. | __invert __ [bản thân] |
Để được gọi để đảo ngược bằng toán tử ~. | __round __ [tự, n] |
__new __ [CLS, khác] | Để được gọi trong một lần khởi tạo của một đối tượng. |
__init __ [bản thân, người khác] | Để được gọi bằng phương thức __new__. |
__del __ [bản thân] | Phương pháp phá hủy. |
__pos __ [bản thân] | Để được gọi cho tích cực đơn, ví dụ: +Một số dự án. |
__neg __ [bản thân] | Để được gọi cho tiêu cực đơn, ví dụ: -Someobject. |
__abs __ [bản thân] | Để được gọi trên hoạt động nhân bằng cách sử dụng toán tử *. |
__floordiv __ [bản thân, người khác] | Để được gọi trên hoạt động phân chia sàn bằng cách sử dụng // toán tử. |
__truediv __ [bản thân, người khác] | Để được gọi vào hoạt động phân chia bằng cách sử dụng / vận hành. |
__mod __ [bản thân, người khác] | Để được gọi trên hoạt động modulo bằng toán tử %. |
__pow __ [tự, khác [, modulo]] | Để được kêu gọi tính toán công suất bằng toán tử **. |
__lt __ [bản thân, người khác] | Để được gọi là so sánh bằng cách sử dụng = toán tử. |
Do đó, bạn có thể sử dụng các phương thức ma thuật thích hợp để thêm các chức năng khác nhau trong lớp tùy chỉnh của bạn.