2016-02-29 89 views
3

我有這個python行類的構造函數,它需要兩個點作爲參數。問題是我的構造函數只是複製引用。所以self.point0和0指向同一個對象。我不確定如何改變這一點,以便我不只是複製參考文獻。 Line類:Python構造函數

def __init__(self, point0, point1): 
    self.point0 = point0 
    self.point1 = point1 

Point類:

def __init__(self, x, y): 
    self.x = x 
    self.y = y 
+1

任何特定的原因是什麼?......爲什麼你想要那個而不是指向同一個對象? –

+0

是的,你爲什麼要它們不同,爲什麼'copy.copy'不滿意? –

+0

按照定義,'Line'和'Point'都可以很容易地重新定義爲'namedtuple's。他們將永遠不變,也許會強制你喜歡的排他性。 'copy.copy'仍然可以工作,就像創建新的實例一樣。 –

回答

3

使用copy模塊:

import copy 

def __init__(self, point0, point1): 

     self.point0 = copy.copy(point0) 
     self.point1 = copy.copy(point1) 

是,如果你點的對象是可變的,如列表或字典必需的。如果您使用的是不可變類型,例如tuple,則不需要進行復制。

如果您的點被表示爲列表,您還可以使用此語法列表的副本:

self.point0 = point0[:] 
self.point1 = point1[:] 

,如果你提供你的觀點類的定義,我可以建議你用更多的確定性。 OP後


更新已發佈Point類定義:

如果copy.copy()是不可取的(爲什麼?),你可以手動的屬性複製到新的Point實例:

class Line(object): 
    def __init__(self, point0, point1): 
     self.point0 = Point(point0.x, point0.y) 
     self.point1 = Point(point1.x, point1.y) 
+0

@cleacrij請在你的問題中發佈你的'Point'類的定義。 – mhawke

+1

一種方法是使用元組,甚至是'collections.namedtuple'來獲得你的點...取決於你的類正在做什麼...... – mhawke

+0

@cleacrij:如果你想繼續使用你的'Point'類,那麼你需要使用'copy.copy()',或者在'Line .__ init __()'中創建'Point'實例,如我的答案更新中所示。 – mhawke