2017-09-26 44 views
0

這可能看起來像一個非常微不足道的問題,但我剛開始學習python類和對象。我有一個像下面的代碼。Python - 類和對象

class Point(object): 
    def __init__(self,x,y): 
      self.x = float(x) 
      self.y = float(y) 
    def __str__(self): 
      return '('+str(self.x)+','+str(self.y)+')' 

def main(): 
p1 = Point(pt1,pt2) 
p2 = Point(pt3,pt4) 
p3 = Point(pt5,pt6) 
p4 = Point(pt7,pt8) 
parray = [p1,p2,p3,p4] 
print " Points are", p1,p2,p3,p4 
print "parray",parray 

我米得到以下輸出:

點是(4.0,2.0)(4.0,8.0)(4.0,-1.0)(100.0,1.0) 粒子陣列 - 在0x7ff09f00a550 intersection.Point對象,intersect.Point對象在0x7ff09f00a410,intersection.Point對象在0x7ff09f00a590

我的問題是爲什麼在打印對象時獲取值時,將對象的地址分配給數組? 有人可以建議一種方法來獲取由main函數中的數組返回的值嗎?

回答

0

更詳細的解釋。當你print對象作爲一個單獨的Python 2中的print語句或Python 3中的print()函數的參數,在打印出對象之前,Python會在對象上調用str

當你把該對象的容器內就像一個列表,並print列表,列表中得到str呼籲,但它反過來調用repr每個它所包含的項目,而不是str的。要理解爲什麼,請查看列表[1, '2, 3', 4],並想象如果打印時引號未包含在輸出中,它會是什麼樣子。引號是'2, 3'字符串的repr的一部分。

因此,爲了使你的班上做你想要的方式,無論是你的__str__方法重新命名爲__repr__(這也將努力爲str電話,因爲__str__默認實現是調用__repr__),或者添加附加__repr__方法。有時,有一個__repr__可以返回一個比__str__更不明確的字符串(例如,它可以命名類以及參數)。一個常見的約定是使__repr__返回一個字符串,該字符串可以是eval以再次獲得等效對象。爲了您的課,可能是這樣的:

def __repr__(self): 
    return "{}({!r}, {!r})".format(type(self).__name__, self.x, self.y) 

我也建議使用字符串格式化像這樣(或稱老%s風格,如果你喜歡),而不是串聯很多串在一起,以建立您的結果。

+0

非常感謝你解釋得非常好! – buddingengineer

+0

很高興幫助。我編輯修復了一些拼寫錯誤,而當我處於這種狀態時,最終又添加了一些更新,甚至還有一些示例代碼,因此請確保查看最新版本。 – Blckknght

0

Python容器,例如清單打印他們的內容時,不是他們__str__使用對象__repr__方法,定義__repr__代替:

def __repr__(self): 
    return '('+str(self.x)+','+str(self.y)+')' 

如果你想的__repr__ VS __str__see here

+0

感謝您的輸入! @Blckknght – buddingengineer