2011-04-28 69 views
6

我想在我的CSC硬件上獲得一些幫助。它在類/對象上,它是一個定義圓的簡單類,名稱爲Circle(object)。「啓用」類比較

的HW的原文(I完成這個HW的第一兩個部分,因此該第三部分是所述初始問題的擴展):

「」「展開在您的Circle類通過使比較使用運算符(例如<,>,> =,< =,==和!=)的Circle對象的圓對象,其中一個Circle如果實際上更大(即,具有更大面積) 。

下面的代碼:

A = Circle(2, 5, 1.5) 
B = Circle(-6, 1, 1) 
print A < B, A != B, A >= B 

應該產生這樣的輸出:

False True True 

這是我的用於顯示的圓的座標和半徑的代碼:在

class Circle(object): 
    def __init__(self, x=0, y=0, r=0): 
     self.x = x 
     self.y = y 
     self.r = r 
    def __str__(self): 
     return "Circle at (%d , %d). Radius: %f" % (self.x, self.y, self.r) 

def main(): 
    print Circle(3, 5, 4.0) 

main() 

這個類的輸出爲「圈(3,5)。半徑:4:000000"

我們,指出我們的課本中的某一頁的數學運營商類: EQ(),GT(),GE(),LT() ,(),NE()等 所以我就在想,爲什麼我的教授希望這樣的事情?

import math 
class Circle(object): 
    def __init__(self, x=0, y=0, r=0): 
     self.x = x 
     self.y = y 
     self.r = r 
    def __str__(self): 
     return "Circle at (%d , %d). Radius: %f" % (self.x, self.y, self.r) 
    def calcArea(self, r): 
     self.r = r 
     return (math.pi)*(r**2) 
    def __gt__(self, circ1Radius, circ2Radius) 
     self.circ1Radius = circ1Radius 
     self.circ2Radius = circ2Radius 
     r1 = circ1Radius 
     r2 = circ2Radius 
     r1 > r2 or r2 > r1 
    def __ge__(self, circ1Radius, circ2Radius) 
    #And so on for __lt__(), __le__(), __ne__(), etc 
def main(): 
    A = Circle(3,4,1.5) 
    B = Circle(1,2,5.0) 
    C = Circle(5,7,7) 
    D = Circle(9,8,3) 
    print A < B, B > C, A < C, A >= C 
main() 
#Output should be "True, False, True, False" 

難道我們還要再definit我們想在課堂中使用的每種方法的離子/屬性?先謝謝你。

回答

9

定義或覆蓋該類的比較運算符。 http://docs.python.org/reference/expressions.html#notin

看起來您正處於正確的軌道上,除非您只需將第二個圓形對象傳遞給您的比較。自我指的是第一個圓圈對象。所以self.r會給你第一個圓的r。你也需要從方法返回True或False。

def __gt__(self, circle2): 
    return self.r > circle2.r 

請注意,這只是比較圓圈的r。

0

簡答:是的。除非從基類繼承此行爲,否則必須定義要支持的比較運算符。

16

您可以使用functools中的total_ordering decorator,如果您提供eq()和另一個,則會生成所有缺少的比較方法。

給定一個類中定義一個或多個 比較豐富排序方法,這 類裝飾用品休息。 這簡化參與 努力指定了所有可能的富 比較運算:

的類必須定義LT()中的一個, (),GT(),或GE()。另外,該類應提供一個 eq()方法。

1

這是不是真的你的問題本身的響應,但請注意,您的calcArea(...)方法就是並不真正需要的是裏面的類。 (請注意,沒有理由在其使用self在所有!)

事實上,你可能想要的是類的東西還在裏面的方法類似

def area(self): 
    return math.pi*(self.r**2) 

,使其實際使用半徑你是「in」的圈子。

+0

是的,我注意到前一陣子也是,謝謝你。我傾向於過度編程,並留下通常不需要的代碼或作爲靜重來執行代碼......當初學者時,我認爲人們傾向於更多地關注程序的工作而不是可讀性和簡潔性。 – Derrick 2011-04-28 22:48:56