Hướng dẫn what are the magic methods for binary operators in python? - các phương thức ma thuật cho toán tử nhị phân trong python là gì?

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 __add__[] sẽ được gọi.

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 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.

>>> DIR [int] ['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__ class__', '__delattr__', '__dir__', ' ',' __float__ ',' __floor__ ',' __floordiv__ ',' __format__ ',' __ge__ ',' __getAttribut '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', ' ',' __radd__ ',' __rand__ ',' __rdivMod__ ',' __reduce__ ',' __reduce_ex__ ',' __repr__ ',' __rfloordiv__ ',' ' ',' __xor__ ',' bit_length ',' liên hợp ',' mẫu số ',' from_bytes ',' hình ảnh ',' tử số ',' real ',' to_bytes ']]
['__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']

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 __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 = 10 >>> num + 5 15 >>> num .__ Thêm __ [5] 15
>>> num + 5
15
>>> num.__add__[5]
15

Như bạn có thể thấy, khi bạn thực hiện num+10, toán tử + gọi phương thức __add__[10]. Bạn cũng có thể gọi

class Employee:
    def __init__[self]:
        self.name='Swati'
        self.salary=10000
    def __str__[self]:
        return 'name='+self.name+' salary=$'+str[self.salary]
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.

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.

Khởi tạo và xây dựng Sự mô tả
__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 Sự mô tả
__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 []. Sự mô tả
__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.

__isub __ [bản thân, người khác] Sự mô tả
__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]

Để được gọi bằng hàm vòng tròn []. Sự mô tả
__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 []. Sự mô tả
__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 Sự mô tả
__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.

Các phương pháp ma thuật trong Python là gì?

Phương pháp ma thuật là các phương pháp đặc biệt trong Python có dấu gạch dưới gấp đôi [Dunder] ở cả hai phía của tên phương thức. Phương pháp ma thuật chủ yếu được sử dụng để vận hành quá tải.special methods in python that have double underscores [dunder] on both sides of the method name. Magic methods are predominantly used for operator overloading.

Phương pháp ma thuật để tạo ra một python thể hiện là gì?

__New __ [] Ngôn ngữ phương thức 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 thức ma thuật __new __ [] được gọi hoàn toàn trước phương thức __init __ [].Phương thức __New __ [] trả về một đối tượng mới, sau đó được khởi tạo bởi __init __ [].__new__[] magic method is implicitly called before the __init__[] method. The __new__[] method returns a new object, which is then initialized by __init__[] .

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

Chúng là những phương pháp đặc biệt mô tả cách một đối tượng nhất định nên hành xử.Chúng luôn được bao quanh bởi các dấu gạch dưới kép [ví dụ: __init__, __lt__].Double nhấn mạnh chỉ ra rằng đây là những phương pháp ma thuật và không nên được lập trình viên gọi trực tiếp, chúng thường được chính người phiên dịch gọi.special methods describing how a certain objects should behave. They are always surrounded by double underscores [e.g. __init__ , __lt__ ]. The double underscores indicate that these are magic methods and shouldn't be called directly by the programmer, they are normally called by the interpreter itself.

__ del __ phương pháp ma thuật cho là gì?

__del__ là một phương pháp phá hủy được gọi là ngay khi tất cả các tài liệu tham khảo của đối tượng bị xóa tức là khi một đối tượng được thu thập rác.Ví dụ: Dưới đây là ví dụ đơn giản về phá hủy.Bằng cách sử dụng từ khóa DEL, chúng tôi đã xóa tất cả các tài liệu tham khảo của đối tượng 'obj', do đó phá hủy được gọi tự động.destructor method which is called as soon as all references of the object are deleted i.e when an object is garbage collected. Example: Here is the simple example of destructor. By using del keyword we deleted the all references of object 'obj', therefore destructor invoked automatically.

Bài Viết Liên Quan

Chủ Đề