2012-09-18 10 views
0

Я пытаюсь создать класс в python под названием «Точка». Я пытаюсь создать точку на координатной плоскости x и y и отслеживать их. Также найдите расстояние между точками. Я должен использовать функции и методы. Я начал, и вот мой код. Я просто не уверен, как использовать его, когда я иду, чтобы выполнить программу. Любая помощь будет оценена.Создание класса Point в Python

EDIT: Обновлен код

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

мне еще нужно помочь понять, как на самом деле использовать код. Вот почему я создал функцию testPoint. Когда я действительно отправляюсь выполнять код в IDLE, как мне доказать, что все работает? Спасибо, ребята!

Мне также нужно добавить код в конструктор, чтобы увеличить значение COUNT на 1 каждый раз, когда создается объект Point. Мне также нужно добавить соответствующий код, чтобы сравнить точки с помощью операторов сравнения, в то время как «точки» сравниваются на основе их расстояния от начала координат.

+3

не пишет добытчик в питоне, если/пока вы не должны делать атрибуты в свойства по какой-либо причине. – wim

+0

Я создавал бы функции x и y и использовал бы их как свойства, как это красиво. – g07kore

ответ

3
  • Вы объявили distance как принимать аргумент p; внутри метода вы ссылаетесь на него как other. Измените p на other в декларации, чтобы они совпадали.

  • sqrt() не является встроенным; вам нужно сделать import math и ссылаться на него как math.sqrt().

  • Вы ничего не делаете с функцией testPoint(), которую вы заявляете; Вы можете вызвать его, добавив строку в конце, как:

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

В этот момент ваш код работает и вычисляет расстояние 4.0 между вашими точками.

Теперь, некоторые вопросы типа:

  • В Python, вы вообще не приватизировать переменные-члены, и вы не потрудились писать тривиальные методы получения и установки, так что вы можете удалить методы getX() и getY() и просто обратитесь к p.X и p.Y непосредственно с адресом Point p.

  • math модуль имеет удобную функцию гипотенузы, поэтому в distance() вы можете изменить линию возврата к return math.hypot(dx,dy).

  • По умолчанию, определенный пользователем объект имеет непривлекательный строковое представление:

    <__main__.Point object at 0x1004e4550>

Вы должны определить метод преобразования строки в своем классе, как так:

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

Это будет использоваться, когда объект будет напечатан, или иначе его нужно преобразовать в строку.

+0

Спасибо, сэр! Очень полезно и основательно. Я применил эти изменения. Мне также нужно добавить код в конструктор, чтобы увеличить значение COUNT на 1 каждый раз, когда создается объект Point. Мне также нужно добавить соответствующий код, чтобы точки можно сравнивать с помощью операторов сравнения, а точки сравниваются на основе их расстояния от начала координат. Наконец, мне все еще нужна помощь, чтобы понять, как выполнить весь этот код. Для чего предназначена функция testPoint. – xrocker15

+0

Похоже, у вас есть ручка. 'p1.move (2, 7)' перемещает 'p1' из своего текущего положения в (5, 11). 'p2.Y' равно 0. Определите операторы сравнения, описанные здесь: http://docs.python.org/reference/datamodel.html#object.__lt__, чтобы сравнить точки на расстоянии от источника (хотя вы, вероятно, можете уйти с просто определяя '__cmp __()'). –

+0

Где бы я реализовал p1.move и прочее. Является ли переменная p1 переменной? Это та часть, которую я смущен – xrocker15

1

В вашем методе Point.distance вы ссылаетесь на other.X и other.Y; Другого не существует.

Вы должны либо изменить сигнатуру расстояния на расстояние (самостоятельно, другое), либо изменить код для использования p.

Вам также необходимо импортировать Math.Sqrt:

from math import sqrt 
5

Не забудьте math.hypot

def distance(self, p): 
    dx = self.X - p.X 
    dy = self.Y - p.Y 
    return hypot(dx, dy) 
0

Поскольку вы спросили о выполнении программы, если вы хотите, чтобы запустить его с помощью команды лайн, то первое, что вам нужно сделать, это просто добавить:

if __name__ == '__main__': 
    testPoint() 

Есть действительно хорошие e xplanations того, что это делает (см .: What does if __name__ == "__main__": do?). Но на самом высоком уровне это вызовет вашу тестовую функцию, когда вы введете python yourfilename.py в командной строке. Вы можете начать отладку, увидев, какие ошибки были выброшены, и что происходит, когда вы делаете изменения, указанные в других ответах.

К назначению COUNT каждый раз, когда вы создаете точку для своего __init__, вы добавили бы: Point.COUNT += 1. COUNT - это переменная класса класса Point. Быстрая заметка о стиле, PEP 8 гласит, что «константы обычно определяются на уровне модуля и записываются всеми заглавными буквами с подчеркиванием, разделяющим слова». Поэтому вы хотите называть его count, поскольку он является переменной переменной. Наконец, в нижней части вашей тестовой функции добавьте строку print Point.count, чтобы вы могли видеть, сколько очков вы создали.

0

Хмм, почему бы не использовать комплекс вместо класса точек? Он имеет все свойства, которые вы ищете, и многое другое (например, вращение).

Вот пример «ООП» комплекс с педантичной нотацией:

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

Смежные вопросы