2011-04-28 3 views
6

내 CSC HW에 대한 도움을 받고 싶습니다. 그것은 클래스/객체에 있으며, 클래스 Circle (객체)라는 이름으로 원을 정의하는 간단한 클래스입니다.클래스에 대한 "사용"비교

HW의 정확한 텍스트 (나는이 얼굴을 처음 두 부분을 완료하고, 따라서이 세번째 부분은 초기 문제에 대한 확장입니다) :

"" "비교를 가능하게하여 Circle 클래스에 확장은 <,> =, < =, == 및! =과 같은 연산자를 사용하는 Circle 객체의 경우, 다른 Circle보다 실제로 큰 경우 (즉 더 큰 영역을 가진 경우) 다른 Circle보다 "더 큰"것으로 간주됩니다 .

다음 코드 :

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

이 출력을 생성해야 :

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(), 있다(), 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는 첫 번째 원 객체를 나타냅니다. 그래서 self.r은 첫 번째 원의 r을 줄 것입니다. 또한 메서드에서 True 또는 False를 반환해야합니다.

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

이 점은 원의 r을 비교 한 것입니다.

0

짧은 대답 : 예. 기본 클래스에서이 동작을 상속하지 않는 한 지원하려는 비교 연산자를 정의해야합니다.

16

eq()과 다른 하나를 제공하면 누락 된 비교 방법을 모두 생성하는 functools에서 total_ordering decorator을 사용할 수 있습니다. 하나 이상의 풍부한 비교 주문 방법을 정의하는 클래스 감안할 때

이 클래스 장식 나머지를 제공합니다.

클래스는 LT() 중 하나 () 된다() 또는 GE 정의해야 이것은 가능한 리치 비교 연산 모두를 지정 관련된 노력을 단순화(). 또한 클래스는 eq() 메소드를 제공해야합니다.

1

이 정말 자체 질문에 대한 응답이 아니라 당신의 calcArea(...) 방법은 그대로 정말 클래스 내부에 필요하지 않습니다. (거기에 전혀 self을 사용할 필요가 없다는 것을주의!)

사실

이, 당신이 아마 원하는 것은 실제로 반경을 사용하도록

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

같은 클래스 뭔가 내부에 여전히 방법 당신이 "안으로"있는 원의.

+0

예 조금 전, 너무 고맙다는 것을 알았습니다. 과도하게 프로그램하고 경향이있는 코드를 작성하는 경향이 있습니다. 보통 초보자라면 가독성과 간결함보다 프로그램을 작동시키는 데 더 중점을 두는 경향이 있습니다. – Derrick

관련 문제