2016-02-29 121 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