iT邦幫忙

0

python 類專有方法

您好:
參考
https://www.runoob.com/python3/python3-class.html

如下範例
請問為何
1.print (v1 + v2) ,他會去自己找 str 來列印?
2.當v1+v2 時,因為是兩個instance 相加,所以它會自動對應到 類的__add__ 函數?
這樣,他是以v1 為主,還是 v2?

謝謝!

class Vector:
   def __init__(self, a, b):
      self.a = a
      self.b = b
 
   def __str__(self):
      return 'Vector (%d, %d)' % (self.a, self.b)
   
   def __add__(self,other):  #加運算
      return Vector(self.a + other.a, self.b + other.b)
 
v1 = Vector(2,10)
v2 = Vector(5,-2)
print (v1 + v2)

print("v1--",v1.a);
print("v2--",v2.a);

結果

Vector (7, 8)
v1-- 2
v2-- 5

echochio iT邦高手 1 級 ‧ 2022-07-03 22:13:56 檢舉
你可印出 v1 v2 就知道了
應該是

Vector (2, 10)
Vector (5, -2)
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

0
frogsoul
iT邦研究生 5 級 ‧ 2022-07-04 06:17:35
  1. 是的。
  2. v1

關於1,可參考邦友這篇:repr與str雜談
詳情可以看cPython的source code的builtin_print_implPyFile_WriteObject
其中PyObject_Str最後就是走到__str__,而PyObject_Repr就是走到__repr__

關於2,你可以簡單改個實驗就知道了:

   def __add__(self,other):  #加運算
      return Vector(self.a, self.b)
0
froce
iT邦大師 1 級 ‧ 2022-07-04 16:00:07

https://docs.python.org/zh-tw/3/reference/datamodel.html?highlight=new#basic-customization

  1. 是的,有__str__方法的物件(ex: Vector(2,10)),你對其做str(Vector(2,10)),會依照這個方法傳回字串。print內部也會調用這個方法自動轉換,要不然print怎麼會什麼類型都能印?
  2. 同上,一樣的道理。只是調用的方式變成用add去做。
  3. 如果會需要用到設計模式,我會建議上面給的連結看完收藏起來。

我要發表回答

立即登入回答