DANH MỤC TÀI LIỆU
Nạp chồng toán tử trong Python
N p ch ng toán t trong Pythonạ ồ
B n có th thay đ i ý nghĩa c a toán t trong Python tùy thu c vào toán
h ng đ c s d ng và ta g i đó là n p ch ng toán t . ượ ử ụ
N p ch ng toán t trong Python là gì?ạ ồ
Toán t Python làm vi c b ng các hàm đ c d ng s n, nh ng m t toán t ệ ằ ượ ự ư
có th đ c s d ng đ th c hi n nhi u ho t đ ng khác nhau. Ví d v i ể ượ ử ụ ụ ớ
toán t ' + ', b n có th c ng s h c hai s v i nhau, có th k t h p hai ố ọ ố ớ ể ế
danh sách, ho c n i hai chu i khác nhau l i…ặ ố
Tính năng này trong Python g i là n p ch ng toán t , cho phép cùng m t ạ ồ
toán t đ c s d ng khác nhau tùy t ng ng c nh. ư ữ ả
V y v n đ gì s x y ra khi ta s d ng n p ch ng toán t v i object c a ẽ ả ử ụ ử ớ
m t l p do ng i dùng khai báo? Hãy theo dõi ví d mô ph ng m t đi m ộ ớ ườ
trong h t a đ hai chi u sau:ệ ọ
class Point:
def __init__(self, x = 0, y = 0):
self.x = x
self.y = y
Ta ch y ch ng trình và nh p vào các đi m:ạ ươ
>>> p1 = Point(2,3)
>>> p2 = Point(-1,2)
>>> p1 + p2
Traceback (most recent call last):
...
TypeError: unsupported operand type(s) for +: 'Point' and 'Point'
Ch ng trình ngay l p t c báo l iươ TypeError vì Python không th nh n hai ể ậ
đ i t ngố ượ Point cùng lúc.
Đ x lý v n đ này, ta s s d ng n p ch ng toán t . ẽ ử
Tr c tiên hãy tìm hi u qua m t s hàm đ c bi t sau đây.ướ ộ ố
Các hàm đ c bi t trong Pythonặ ệ
Hàm trong Class đ c b t đ u v i hai d u g ch d i li n nhauượ ầ ớ ấ ạ ướ (__) là các
hàm đ c bi t, mang các ý nghĩa đ c bi t.ặ ệ ặ ệ
Có r t nhi u hàm đ c bi t trong Python và m t trong đó là ặ ệ
hàm __init__() mà Quantrimang đã gi i thi u tr c đó trong ệ ướ bài h c v ọ ề
Class và Object. Hàm này đ c g i b t c khi nào kh i t o m t đ i t ng,ượ ở ạ ố ư
m t bi n m i trong class.ộ ế
M c đích khi s d ng các hàm đ c bi t này là giúp nh ng hàm c a chúng ử ụ
ta t ng thích v i các hàm đ c d ng s n trong Python.ươ ượ ự
>>> p1 = Point(2,3)
>>> print(p1)
<__main__.Point object at 0x00000000031F8CC0>
B n nên khai báo ph ng th c ươ __str__() trong class đ ki m soát cách hi nể ể
th k t qu đ c in ra.ị ế ả ượ
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)
Và bây gi th l i v i hàm ử ạ print()
>>> p1 = Point(2,3)
>>> print(p1)
(2,3)
S d ngử ụ __str__() làm k t qu hi n th chu n h n. Ngoài ra b n có th in ế ả ể ị ơ
ra k t qu t ng t b ng cách s d ng hàm tích h p s n trong Python ế ươ ự ằ ử ụ
là str() ho c format().
>>> str(p1)
'(2,3)'
>>> format(p1)
'(2,3)'
Khi s d ngử ụ str() và format(), Python th c hi n l nh g i p1.__str__() nên
k t qu đ c tr v t ng t .ế ư ề ươ
N p ch ng toán t ' + ' trong Pythonạ ồ
Đ n p ch ng toán t ' + ', ta s s d ng hàm ẽ ử __add__() trong class. Ta
th tri n khai nhi u công vi c b ng hàm này, ví d nh c ng hai đi m t a ư ộ
đ ví d bên trên.ộ ở
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)
Ta ch y ch ng trình và nh p vào các đi m:ạ ươ
>>> p1 = Point(2,3)
>>> p2 = Point(-1,2)
>>> print(p1 + p2)
(1,5)
ch ng trình này, khi b n th c hi n ươ p1 + p2, Python s g i ẽ ọ
ra p1.__add__(p2).
Tương tự như vậy, bạn có thể nạp chồng nhiều toán tử khác.
Quantrimang xin giới thiệu một số hàm đặc biệt dùng cho nạp
chồng toán tử trong bảng dưới đây:
TOÁN TBI U DI NỂ Ễ HO T Đ NGẠ Ộ
Phép c ngp1 + p2 p1.__add__(p2)
Phép trp1 - p2 p1.__sub__(p2)
Phép nhân p1 * p2 p1.__mul__(p2)
Lũy th ap1 ** p2 p1.__pow__(p2)
Phép chia p1 / p2 p1.__truediv__(p2)
Phép chia l y ph n ấ ầ
nguyên (Floor Division) p1 // p2 p1.__floordiv__(p2)
S dố ư (modulo) p1 % p2 p1.__mod__(p2)
Thao tác trên bit: phép
d ch tráip1 << p2 p1.__lshift__(p2)
Thao tác trên bit: phép
d ch ph iị ả p1 >> p2 p1.__rshift__(p2)
Thao tác trên bit:
phép AND p1 & p2 p1.__and__(p2)
Thao tác trên bit: phép
OR p1 | p2 p1.__or__(p2)
Thao tác trên bit: phép
XOR p1 ^ p2 p1.__xor__(p2)
Thao tác trên bit: phép
NOT ~p1 p1.__invert__()
N p ch ng toán t so sánh trong Pythonạ ồ
Python không ch gi i h n đ c phép n p ch ng các toán t toán h c, mà ỉ ớ ạ ượ
còn cho phép ng i dùng n p ch ng toán t so sánh.ườ ạ ồ
Có nhi u toán t so sánh đ c h tr b i Python, ví d nh : <, >, <=, >=, ượ ợ ở ư
==,...
B n s d ng n p ch ng toán t này khi mu n so sánh các đ i t ng trong ử ụ ượ
l p v i nhau.ớ ớ
Ví d b n mu n so sánh các đi m trong classụ ạ Point, hãy so sánh đ l n c aộ ớ
các đi m này b t đ u t g c t a đ , th c hi n nh sau: ừ ố ư
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
Ta ch y ch ng trình và nh p vào các đi m và toán t dùng đ só sánh:ạ ươ
>>> Point(1,1) < Point(-2,-3)
True
>>> Point(1,1) < Point(0.5,-0.2)
False
>>> Point(1,1) < Point(1,1)
False
Tương tự như vậy, bạn có thể nạp chồng nhiều toán tử so sánh
khác. Quantrimang xin giới thiệu một số hàm đặc biệt dùng cho
nạp chồng toán tử so sánh trong bảng dưới đây:
TOÁN TBI U DI NỂ Ễ HO T Đ NGẠ Ộ
Nh h nỏ ơ p1 < p2 p1.__lt__(p2)
Nh h n ho c b ngỏ ơ p1 <= p2 p1.__le__(p2)
B ngp1 == p2 p1.__eq__(p2)
Khác p1 != p2 p1.__ne__(p2)
L n h nớ ơ p1 > p2 p1.__gt__(p2)
L n h n ho c b ng ơ ặ ằ
thông tin tài liệu
Bạn có thể thay đổi ý nghĩa của toán tử trong Python tùy thuộc vào toán hạng được sử dụng và ta gọi đó là nạp chồng toán tử.
Mở rộng để xem thêm
từ khóa liên quan
xem nhiều trong tuần
yêu cầu tài liệu
Giúp bạn tìm tài liệu chưa có

LÝ THUYẾT TOÁN


×