Anda boleh mengubah makna pengendali di Python bergantung pada operasi yang digunakan. Dalam tutorial ini, anda akan belajar bagaimana menggunakan overloading operator dalam Python Object Oriented Programming.
Lebihan Operator Python
Pengendali Python bekerja untuk kelas terbina dalam. Tetapi pengendali yang sama berkelakuan berbeza dengan pelbagai jenis. Sebagai contoh, +
pengendali akan melakukan penambahan aritmetik pada dua nombor, menggabungkan dua senarai, atau menggabungkan dua rentetan.
Ciri ini di Python yang membolehkan pengendali yang sama mempunyai makna yang berbeza sesuai dengan konteks yang disebut operator overloading.
Jadi apa yang berlaku apabila kita menggunakannya dengan objek kelas yang ditentukan pengguna? Mari kita pertimbangkan kelas berikut, yang cuba mensimulasikan titik dalam sistem koordinat 2-D.
class Point: def __init__(self, x=0, y=0): self.x = x self.y = y p1 = Point(1, 2) p2 = Point(2, 3) print(p1+p2)
Pengeluaran
Traceback (panggilan terakhir terakhir): File "", baris 9, dalam bentuk cetak (p1 + p2) TypeError: jenis operan yang tidak disokong untuk +: 'Point' dan 'Point'
Di sini, kita dapat melihat bahawa TypeError
itu dibangkitkan, kerana Python tidak tahu bagaimana menambah dua Point
objek bersama-sama.
Walau bagaimanapun, kita dapat mencapai tugas ini di Python melalui pembebanan operator yang berlebihan. Tetapi pertama, mari kita fahami tentang fungsi khas.
Fungsi Khas Python
Fungsi kelas yang bermula dengan garis bawah ganda __
disebut fungsi khas di Python.
Fungsi-fungsi ini bukan fungsi khas yang kita tentukan untuk kelas. Yang __init__()
fungsi kita yang ditakrifkan di atas adalah salah satu daripada mereka. Ia dipanggil setiap kali kita membuat objek baru kelas itu.
Terdapat banyak fungsi khas lain di Python. Lawati Fungsi Khas Python untuk mengetahui lebih lanjut mengenainya.
Dengan menggunakan fungsi khas, kita dapat menjadikan kelas kita serasi dengan fungsi terbina dalam.
>>> p1 = Point(2,3) >>> print(p1)
Katakan kita mahu print()
fungsi mencetak koordinat Point
objek dan bukannya apa yang kita dapat. Kami dapat menentukan __str__()
kaedah di kelas kami yang mengawal bagaimana objek dicetak. Mari lihat bagaimana kita dapat mencapainya:
class Point: def __init__(self, x = 0, y = 0): self.x = x self.y = y def __str__(self): return "((0),(1))".format(self.x,self.y)
Sekarang mari kita cuba print()
fungsinya lagi.
class Point: def __init__(self, x=0, y=0): self.x = x self.y = y def __str__(self): return "((0), (1))".format(self.x, self.y) p1 = Point(2, 3) print(p1)
Pengeluaran
(2, 3)
Itu lebih baik. Ternyata, kaedah yang sama ini digunakan ketika kita menggunakan fungsi bawaan str()
atau format()
.
>>> str(p1) '(2,3)' >>> format(p1) '(2,3)'
Oleh itu, semasa anda menggunakan str(p1)
atau format(p1)
, Python secara dalaman memanggil p1.__str__()
kaedah tersebut. Oleh itu namanya, fungsi khas.
Sekarang mari kita kembali kepada pembebanan operator yang berlebihan.
Membebani Operator +
Untuk membebani +
operator, kita perlu melaksanakan __add__()
fungsi di kelas. Dengan kekuatan yang besar datang tanggungjawab yang besar. Kita boleh melakukan apa sahaja yang kita mahu, di dalam fungsi ini. Tetapi lebih masuk akal untuk mengembalikan Point
objek dari jumlah koordinat.
class Point: def __init__(self, x=0, y=0): self.x = x self.y = y def __str__(self): return "((0),(1))".format(self.x, self.y) def __add__(self, other): x = self.x + other.x y = self.y + other.y return Point(x, y)
Sekarang mari kita cuba operasi penambahan sekali lagi:
class Point: def __init__(self, x=0, y=0): self.x = x self.y = y def __str__(self): return "((0),(1))".format(self.x, self.y) def __add__(self, other): x = self.x + other.x y = self.y + other.y return Point(x, y) p1 = Point(1, 2) p2 = Point(2, 3) print(p1+p2)
Pengeluaran
(3,5)
Apa yang sebenarnya berlaku ialah, apabila anda menggunakan p1 + p2
, panggilan Python p1.__add__(p2)
yang seterusnya adalah Point.__add__(p1,p2)
. Selepas ini, operasi penambahan dijalankan seperti yang kita tentukan.
Begitu juga, kita juga boleh membebani operator lain Fungsi khas yang perlu kita laksanakan dibentangkan di bawah.
Pengendali | Ungkapan | Secara dalaman |
---|---|---|
Penambahan | p1 + p2 | p1.__add__(p2) |
Penolakan | p1 - p2 | p1.__sub__(p2) |
Pendaraban | p1 * p2 | p1.__mul__(p2) |
Kuasa | p1 ** p2 | p1.__pow__(p2) |
Bahagian | p1 / p2 | p1.__truediv__(p2) |
Bahagian Lantai | p1 // p2 | p1.__floordiv__(p2) |
Kekal (modulo) | p1 % p2 | p1.__mod__(p2) |
Anjakan Kiri Bitwise | p1 << p2 | p1.__lshift__(p2) |
Pergeseran Kanan Bitwise | p1>> p2 | p1.__rshift__(p2) |
Sedikit demi sedikit DAN | p1 & p2 | p1.__and__(p2) |
Sedikit demi sedikit ATAU | p1 | p2 | p1.__or__(p2) |
Bitwise XOR | p1 p2 | p1.__xor__(p2) |
Sedikit demi sedikit TIDAK | ~p1 | p1.__invert__() |
Pengendali Perbandingan Berlebihan
Python tidak mengehadkan beban operator yang berlebihan kepada pengendali aritmetik sahaja. Kami juga boleh membebani operator perbandingan.
Katakan kita mahu menerapkan simbol <
simbol yang kurang daripada di Point
kelas kita .
Mari kita bandingkan besarnya titik-titik ini dari asal dan mengembalikan hasilnya untuk tujuan ini. Ia dapat dilaksanakan seperti berikut.
# overloading the less than operator class Point: def __init__(self, x=0, y=0): self.x = x self.y = y def __str__(self): return "((0),(1))".format(self.x, self.y) def __lt__(self, other): self_mag = (self.x ** 2) + (self.y ** 2) other_mag = (other.x ** 2) + (other.y ** 2) return self_mag < other_mag p1 = Point(1,1) p2 = Point(-2,-3) p3 = Point(1,-1) # use less than print(p1
Output
True False False
Similarly, the special functions that we need to implement, to overload other comparison operators are tabulated below.
Operator Expression Internally
Less than p1 < p2
p1.__lt__(p2)
Less than or equal to p1 <= p2
p1.__le__(p2)
Equal to p1 == p2
p1.__eq__(p2)
Not equal to p1 != p2
p1.__ne__(p2)
Greater than p1> p2
p1.__gt__(p2)
Greater than or equal to p1>= p2
p1.__ge__(p2)