2017-07-31 94 views
0

我想让两个实例具有相同名称一样,Python的OOP,不能覆盖实例

a = SomeClass(someAttr1) 
a = SomeClass(someAttr2) 

,使新人们应该覆盖前一个。

我也试过这样:

a = SomeClass(someAttr1) 
a = None 
a = SomeClass(someAttr2) 

我试过,但它不会覆盖以前的实例,并增加了它本身,有没有办法做到这一点?

下面是代码:

### Do not change the Location or Campus classes. ### 
### Location class is the same as in lecture.  ### 
class Location(object): 
    def __init__(self, x, y): 
     self.x = x 
     self.y = y 

    def move(self, deltaX, deltaY): 
     return Location(self.x + deltaX, self.y + deltaY) 

    def getX(self): 
     return self.x 

    def getY(self): 
     return self.y 

    def dist_from(self, other): 
     xDist = self.x - other.x 
     yDist = self.y - other.y 
     return (xDist ** 2 + yDist ** 2) ** 0.5 

    def __eq__(self, other): 
     return (self.x == other.x and self.y == other.y) 

    def __str__(self): 
     return '<' + str(self.x) + ',' + str(self.y) + '>' 


class Campus(object): 
    def __init__(self, center_loc): 
     self.center_loc = center_loc 

    def __str__(self): 
     return str(self.center_loc) 


class MITCampus(Campus): 
    """ A MITCampus is a Campus that contains tents """ 
    tents_list = [] 
    def __init__(self, center_loc, tent_loc=Location(0, 0)): 
     """ Assumes center_loc and tent_loc are Location objects 
     Initializes a new Campus centered at location center_loc 
     with a tent at location tent_loc """ 
     # Your code here 
     Campus.__init__(self, center_loc) 
     self.tent_loc = tent_loc 
     self.tents_list.append(self.tent_loc) 

    def add_tent(self, new_tent_loc): 
     """ Assumes new_tent_loc is a Location 
     Adds new_tent_loc to the campus only if the tent is at least 0.5 distance 
     away from all other tents already there. Campus is unchanged otherwise. 
     Returns True if it could add the tent, False otherwise. """ 
     # Your code here 

     new_tent_flag = True 
     for loc in self.tents_list: 
      if loc == new_tent_loc or new_tent_loc.dist_from(loc) < 0.5: 
       new_tent_flag = False 

     if new_tent_flag: 
      self.tents_list.append(new_tent_loc) 
      return True 
     else: 
      return False 


    def get_tents(self): 
     """ Returns a list of all tents on the campus. The list should contain 
     the string representation of the Location of a tent. The list should 
     be sorted by the x coordinate of the location. """ 
     # Your code here 
     new_list_sorted = sorted(self.tents_list, key=lambda tent: tent.getX()) 
     str_list = [] 
     for x in new_list_sorted: 
      str_list.append(x.__str__()) 

     return str_list 

测试用例:

Test: 0 


     c = MITCampus(Location(1,2)) 
     print(c.add_tent(Location(1,2))) 
     print(c.add_tent(Location(0,0))) 
     print(c.add_tent(Location(2,3))) 
     print(c.add_tent(Location(2,3))) 
     print(c.get_tents()) 


Output: 

    True 
    False 
    True 
    False 
    ['<0,0>', '<1,2>', '<2,3>'] 

Test: 1 


     init campus with default tent loc 
     c = MITCampus(Location(-1,-2)) 
     print(sorted(c.get_tents())) 


Output: 

    ['<0,0>','<0,0>', '<1,2>', '<2,3>'] 

Expected Output: 

     ['<0,0>'] 

可以看出的是,二审应覆盖前一个,而是它被添加。代码中的问题是什么?以及如何解决它?

+2

请创建一个[mcve]。 “不覆盖”是非常模糊的。你为什么认为旧的对象没有被覆盖? –

+0

我不知道为什么你删除了这些调用,但现在这个问题没有任何意义。你应该创建一个代码的最小例子,而不是删除整个事情。 – spicypumpkin

+0

我删除了代码,因为它是任务,我不知道我被允许将它放在这里,也破坏了任务的目的。 但是是的,我会更好地更新它 – fluffy

回答

0

好的, 您的tents_list属性是类属性,因此即使您的c对象被覆盖,tents_list属性保持不变。 最好将你的tents_list作为对象参数,这样tents_list属性也会被覆盖。

def __init__(self, center_loc, tent_loc=Location(0, 0)): 
    Campus.__init__(self, center_loc) 
    self.tents_list = [] # <--- Add this 
    self.tent_loc = tent_loc 
    self.tents_list.append(self.tent_loc) 
+0

你应该更新你以前的答案,而不是生成另一个 –

+0

好吧,感谢您的建议。 – Zcode

+0

这工作得很好,谢谢,但只有一个错误,我应该更新关于该职位? – fluffy

0

对象被覆盖,但你定义tents_list为类变量,因此所有的MITCampus份额此列表中的实例。 因此,任何新的实例都会添加到该列表中,并认为您没有被“覆盖”。

如果您想要“覆盖”行为,请将tents_list转换为__init__方法,如self.tents_list。只有这样它才会对每个实例都是唯一的。