Hacer una clase de puntos en Python

Estoy tratando de crear una clase en python titulada “Punto”. Estoy tratando de crear un punto en un plano de coordenadas x e y, y seguirlos. Así como encontrar la distancia entre los puntos. Tengo que usar funciones y métodos. He empezado y aquí está mi código. Simplemente no estoy seguro de cómo usarlo cuando voy a ejecutar el progtwig. Cualquier ayuda será apreciada.

EDITAR: Código actualizado

import math class Point(object): '''Creates a point on a coordinate plane with values x and y.''' COUNT = 0 def __init__(self, x, y): '''Defines x and y variables''' self.X = x self.Y = y def move(self, dx, dy): '''Determines where x and y move''' self.X = self.X + dx self.Y = self.Y + dy def __str__(self): return "Point(%s,%s)"%(self.X, self.Y) def getX(self): return self.X def getY(self): return self.Y def distance(self, other): dx = self.X - other.X dy = self.Y - other.Y return math.sqrt(dx**2 + dy**2) def testPoint(x=0,y=0): '''Returns a point and distance''' p1 = Point(3, 4) print p1 p2 = Point(3,0) print p2 return math.hypot(dx, dy) print "distance = %s"%(testPoint()) 

Todavía necesito ayuda para entender cómo usar realmente el código. Es por eso que creé la función testPoint . Cuando realmente voy a ejecutar el código en IDLE, ¿cómo pruebo que todo funciona? Muchas gracias chicos !!

También necesito agregar código al constructor para incrementar COUNT en 1 cada vez que se crea un objeto Point. También necesito agregar el código apropiado para poder comparar los puntos usando los operadores de comparación, mientras que los ‘puntos’ se comparan según su distancia desde el origen.

No te olvides de math.hypot

 def distance(self, p): dx = self.X - pX dy = self.Y - pY return hypot(dx, dy) 
  • Declaraste la distance como tomando un argumento p ; Dentro del método te estás refiriendo a él como other . Cambie p a other en la statement para que coincidan.

  • sqrt() no es un builtin; debe import math y referirse a ella como math.sqrt() .

  • No estás haciendo nada con la función testPoint() que declaras; Puedes invocarlo agregando una línea al final como:

print "distance = %s"%(testPoint())

En ese punto, su código funciona y calcula una distancia de 4.0 entre sus puntos.

Ahora, algunos problemas de estilo:

  • En Python, generalmente no privatiza las variables miembro, y no se molesta en escribir getters y setters triviales, por lo que puede eliminar los getX() y getY() y simplemente referirse a pX y pY directamente dado un Point p .

  • El módulo math tiene una conveniente función de hipotenusa, por lo que en la distance() puede cambiar la línea de return math.hypot(dx,dy) para return math.hypot(dx,dy) .

  • De forma predeterminada, un objeto definido por el usuario tiene una representación de cadena poco atractiva:

    <__main__.Point object at 0x1004e4550>

Debería definir un método de conversión de cadena en su clase como tal:

  def __str__(self): return "Point(%s,%s)"%(self.X,self.Y) 

Esto se usará cuando se imprima el objeto, o de lo contrario se debe convertir en una cadena.

En su método Point.distance, hace referencia a other.X y other.Y; El otro no existe.

Debe cambiar la firma de distancia a ser distance (self, other) o cambiar el código para usar p.

También necesitarás importar math.sqrt:

 from math import sqrt 

Hum, ¿por qué no usar complejo en lugar de una clase de puntos? Tiene todas las propiedades que está buscando y más (como la rotación).

Aquí hay un ejemplo para “OOP” el complejo con una notación pedante:

https://gist.github.com/jul/9286835

Dado que ha preguntado sobre la ejecución del progtwig, si desea ejecutarlo desde la línea de comandos, lo primero que debe hacer es agregar:

 if __name__ == '__main__': testPoint() 

Realmente hay buenas explicaciones de lo que esto hace (ver: ¿Qué hace si __name__ == “__main__”: do? ). Pero en el nivel más alto, esto llamará a su función de prueba cuando ingrese python yourfilename.py en el símbolo del sistema. Puede comenzar a depurar viendo qué errores se producen y qué sucede cuando realiza los cambios en las otras respuestas.

Para boost COUNT cada vez que cree un punto en su __init__ , debe agregar: Point.COUNT += 1 . COUNT es una variable de clase de la clase Point. Una nota rápida sobre el estilo, PEP 8 dice que “las constantes generalmente se definen en un nivel de módulo y se escriben en mayúsculas con guiones bajos que separan las palabras”. Así que querrías llamarlo count porque es una variable de clase mutable. Finalmente, en la parte inferior de la función testPoint, agregue una línea print Point.count para que pueda ver cuántos puntos creó.