Python

Operator Overloading Methods (Python 3)

Với Operator overloading methods, các class có thể sử dụng các built-in functions và built-in operators của Python như các method riêng của mình.

Example 1: Sử dụng __str__(self) và __iadd__(self, other) method

class Point:
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y

    def __repr__(self):
        return 'Point({0}, {1})'.format(self.x, self.y)

    def __add__(self, nextPoint):
        return Point(self.x+nextPoint.x, self.y+nextPoint.y)

    def __iadd__(self, nextPoint):
        self.x += nextPoint.x
        self.y += nextPoint.y
        return self

Kết quả:
>>> A = Point(5,10)
>>> B = Point(2,-3)
>>> A
Point(5, 10)
>>> B
Point(2, -3)
>>> A+B
Point(7, 7)
>>> B += A
>>> B
Point(7, 7)

Khi function print(pointA) được gọi, Python sẽ gọi method __str__(self) của class Point.
Tương tự, khi operator + hoặc += được sử dụng, Python sẽ gọi method __add__(self, nexPoint) hoặc __iadd__(self, nextPoint) tương ứng của class Point và thực hiện phép cộng tọa độ.


Các operator overloading method thường dùng

  • __init__(self[, arg]*): Invoked on class(args…). This is the constructor method that initializes the new instance, self.
  • __repr__(self): Invoked on repr(self). Also invoked on str(self) and print(self) if there is no __str__.
  • __str__(self): Invoked on str(self) and print(self). This method generally returns a high level “user friendly” string representation of self.
  • __add__(self, other): Invoked on self + other.
  • __sub__(self, other): Invoked on self − other.
  • __mul__(self, other): Invoked on self * other.
  • __lt__(self, other)
  • __le__(self, other)
  • __eq__(self, other)
  • __ne__(self, other)
  • __gt__(self, other)
  • __ge__(self, other)
  • __len__(self): Invoked on len(self), return the length of object
  • __getitem__(self, position): Invoked on self[position], self[i:j:k] and for x in self.

Example 2: Sử dụng __gt__(self, other) method

class myTime:
	def __init__(self, hours, mins, secs):
		total = hours*3600 + mins*60 + secs
		self.toHour(total)

	def __str__(self):
		return "{0}:{1}:{2}".format(self.hours, self.mins, self.secs)

	def toSecond(self):
		return self.hours*3600 + self.mins*60 + self.secs

	def __gt__(self, time):
		if self.toSecond() > time.toSecond():
			return True
		else:
			return False

Kết quả:
>> time1 = myTime(2,30,45)
>> time2 = myTime(3,5,10)
>> print(time1 > time2)
False

Khi operator > được thực hiện, class myTime sẽ gọi method __gt__(self, time) của nó.


How special methods are used

Điều đầu tiên cần biết về Special methods là chúng được gọi bởi trình thông dịch Python, không phải bởi người dùng.

Trở lại example 1, chúng ta không trực tiếp gọi hàm pointA.__str__(), thay vào đó chúng ta sử dụng print(pointA) và vì pointA là một instance của user-defined class Point nên Python sẽ gọi method __str__  của instance pointA.

Thường thì các Special methods được gọi ngầm. Ví dụ: statement for i in x thực chất sẽ gọi iter(x) và iter(x) sẽ chuyển thành x.__iter__() nếu có thể.

Tham khảo:
[1] Python pocket reference.
[2] Fluent Python.

One thought on “Operator Overloading Methods (Python 3)

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s