2014-02-09 32 views
1

我有這個python代碼,這似乎很直接,但是當我嘗試加載它時,我得到一個錯誤,如上所示。您也可以在下面查看完整的錯誤消息。請問我做錯了什麼?謝謝。如何修復AttributeError:'str'對象沒有屬性'_radius'?

import math 

class Circle2D(object): 
    def __init__(self, x = 0, y = 0, radius = 0): 
     self._x = x 
     self._y = y 
     self._radius = radius 
    def __str__(self): 
     return "Circle with center (" + str(self._x) + ", " + str(self._y) + ")" 
    def getX(self): 
     return self._x 
    def getY(self): 
     return self._y 
    def getArea(self): 
     return (math.pi * self._radius**2) 
    def getPerimeter(self): 
     return (math.pi * 2 *self._radius) 
    def containsPoint(self, x, y): 
     if (((x - self._x)**2 - (y - self._y)**2) < self._radius**2): 
      return True 
     else: 
      return False 
    def contains(self, second): 
     distance = math.sqrt((self._x - second._x)**2 + (self._y - second._y)**2) 
     if ((second._radius + distance) <= self._radius): 
      return True 
     else: 
      return False 
    def overlaps(self, second): 
     distance = math.sqrt((self._y - second._y)**2 + (self._x - second._x)**2) 
     if (distance <= (self._radius + second 
         ._radius)): 
      return True 
     else: 
      return False 
    def __contains__(self, anotherCircle): 
     distance = math.sqrt((self._x - anotherCircle._x)**2 + (self._y - anotherCircle._y)**2) 
     if(self._radius >= (anotherCircle._radius + distance)): 
      return True 
     else: 
      return False 
    def __cmp__(self, anotherCircle): 
     if self._radius > anotherCircle._radius: 
      return 1 
     elif self._radius > anotherCircle._radius: 
      return -1 
     else: 
      return 0 
    def __eq__(self, anotherCircle): 
     if self._radius == anotherCircle._radius: 
      return True 
     else: 
      return False 
    def __ne__(self, anotherCircle): 
     if self._radius == anotherCircle._radius: 
      return False 
     else: 
      return True 

當我的Runn它和幾個步驟後,外殼只是表明:

Traceback (most recent call last): 
    File "C:\Users\wxwdd_000\Desktop\HW_2.py", line 124, in <module> 
    main() 
    File "C:\Users\wxwdd_000\Desktop\HW_2.py", line 121, in main 
    print 'c1 == "Hello"?', c1 == "Hello" 
    File "C:\Users\wxwdd_000\Desktop\HW_2.py", line 57, in __eq__ 
    if self._radius == anotherCircle._radius: 
AttributeError: 'str' object has no attribute '_radius' 

我怎樣才能修復代碼?

回答

2

Circle2D.__eq__假定anotherCircleCircle2D實例。但是你正在通過str物品。

來處理,你需要檢查實例類型。

def __eq__(self, anotherCircle): 
    return isinstance(anotherCircle, Circle2D) and \ 
      self._radius == anotherCircle._radius 
+0

它的作品!謝謝!! – BengDai

+1

@BengDai,歡迎來到Stack Overflow!有些人試圖回答你的問題。如果這對你有幫助,你可以通過[接受答案](http://meta.stackexchange.com/a/5235)告訴社區,這對你最有用。 – falsetru

0

假設c1是一個圓,然後c1 == "Hello"調用c1.__eq__("Hello"),分配「你好」,以anotherCircle這個函數中的表達式。 「你好」是str

1

你不能對一個字符串比較一個Circle2D情況下,因爲__eq__(平等)方法查找第二對象,在這種情況下是一個字符串上_radius屬性,因此現在沒有。

要麼你沒有意識到c1Circle2D,或者你試圖比較它的等於"Hello"作爲早期測試,沒有期望它是真實的。

如果你比較c1對另一Circle2D你不會得到這個錯誤。也許c2


當你試圖評估c1 == "Hello",Python的實際調用這個方法:c1.__eq__("Hello")