2011-04-28 25 views
6

Me gustaría obtener ayuda con mi CSC HW. Está en clases/objetos, y es una clase simple sobre la definición de un círculo, con la clase de nombre Círculo (objeto)."Habilitar" la comparación para las clases

El texto exacto del HW (I completaron las dos primeras partes de este HW y por lo tanto esta tercera parte es una expansión en el problema inicial):

"" "Expandir en su clase Circle, permitiendo la comparación de objetos circulares que utilizan operadores como <,>,> =, < =, == y! =, donde un círculo se considera "más grande" que otro si de hecho es más grande (es decir, tiene mayor área) que el otro círculo .

El siguiente código:

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

debe generar esta salida:

False True True 

Este es mi código para la visualización de las coordenadas y el radio del círculo:

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() 

La salida de esta clase es "círculo en (3, 5). Radio: 4: 000000"

Nos indicaron a una determinada página de nuestro libro de texto con operadores matemáticos para las clases: eq(), gt(), ge(), lt() , le(), ne(), etc. Así que estaba pensando, qué mi profesor quiere algo como esto?

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" 

¿hay que hacer una Definit ion/attribute para cada método que queremos usar en la clase? Gracias de antemano.

Respuesta

9

Define o anula los operadores de comparación para la clase. http://docs.python.org/reference/expressions.html#notin

Parece que va por buen camino, excepto que solo necesita pasar el segundo círculo para su comparación. self se refiere al primer objeto circular. Así que self.r te daría la r del primer círculo. También debe devolver True o False del método.

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

Tenga en cuenta que esto es solo la comparación de las r de los círculos.

0

Respuesta corta: Sí. Debe definir los operadores de comparación que desea admitir a menos que herede este comportamiento de una clase base.

16

Puede usar el total_ordering decorator de functools, que genera todos los métodos de comparación faltantes si proporciona eq() y otro más.

Dada una clase que define una o más ricos métodos de comparación de pedido, esta clase decorador suministra el resto. Esto simplifica el esfuerzo involucrado en especificando todos los posibles ricos operaciones de comparación:

la clase debe definir uno de lt(), le(), gt(), o ge(). Además, la clase debe proporcionar un método eq().

1

esto no es realmente una respuesta a su pregunta per se, pero tenga en cuenta que el método de calcArea(...) tal cual en realidad no necesita estar dentro de la clase. (Tenga en cuenta que no hay ninguna razón para utilizar self en absoluto en él!)

De hecho, lo que es probable que quieres es un método todavía dentro de la clase algo como

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

por lo que realmente utiliza el radio del círculo en el que estás "adentro".

+0

Sí, lo noté hace un rato, también, gracias por eso. Tiendo a programar en exceso y dejo el código que generalmente no es necesario o que se lleva como peso muerto ... Cuando eres un principiante, creo que uno tiende a enfocarse más en lograr que el programa funcione que la legibilidad y la concisión. – Derrick

Cuestiones relacionadas