2016-12-16 4 views
4

Я пытаюсь изучить объектно-ориентированное программирование на Python. Для этого мне нужно создать метод, который вычисляет наклон линии, соединяющей начало координат с точкой. (Я думаю), мы предполагаем, что начало координат (0,0). Например:Метод, который вычисляет наклон в Python

Point(4, 10).slopeFromOrigin() 
2.5 
Point(12, -3).slopeFromOrigin() 
-0.25 
Point(-6, 0).slopeFromOrigin() 
0 

И мы используем уравнение slope = (Y2 - Y1)/(X2 - X1) вычислить наклон. Кроме того, поскольку деление на 0 не разрешено, нам нужно вернуть None, когда метод завершится с ошибкой. Вот что я пробовал:

class Point: 

#Point class for representing and manipulating x,y coordinates 

    def __init__(self, initX, initY): 

#Create a new point at the given coordinates 

     self.x = initX 
     self.y = initY 

    def getX(self): 
     return self.x 

    def getY(self): 
     return self.y 

    def distanceFromOrigin(self): 
     return ((self.x ** 2) + (self.y ** 2)) ** 0.5 

#define a method called slopeFromOrigin here 

    def slopeFromOrigin(self): 

#set origin values for x and y (0,0) 

     self.x = 0 
     self.y = 0 

#slope = (Y2 - Y1)/(X2 - X1) 

     if (Point(x) - self.x) == 0: 

      return None 

     else: 

      return (Point(y) - self.y)/(Point(x) - self.x) 

#some tests to check our code 

from test import testEqual 
testEqual(Point(4, 10).slopeFromOrigin(), 2.5) 
testEqual(Point(5, 10).slopeFromOrigin(), 2) 
testEqual(Point(0, 10).slopeFromOrigin(), None) 
testEqual(Point(20, 10).slopeFromOrigin(), 0.5) 
testEqual(Point(20, 20).slopeFromOrigin(), 1) 
testEqual(Point(4, -10).slopeFromOrigin(), -2.5) 
testEqual(Point(-4, -10).slopeFromOrigin(), 2.5) 
testEqual(Point(-6, 0).slopeFromOrigin(), 0) 

Как вы можете видеть, что я пытаюсь сказать, что нам нужен первый параметр точки быть x2, а второй параметр Поинт быть y2. Я пробовал это таким образом и получил

NameError: name 'y' is not defined on line 32.

Я также попытался получить индексные значения точки, как это:

return (Point[0] - self.y/(Point[1] - self.x)

Но это также дало мне сообщение об ошибке:

TypeError: 'Point' does not support indexing on line 32

я не уверен, как чтобы получить значения параметров x и y от Point, чтобы метод работал, когда он был протестирован. Пожалуйста, поделитесь своими предложениями, если у вас есть. Спасибо.

+0

Возвращение 'None', когда вызов не является не очень хорошей идеей. Почему бы не позволить ошибке просто произойти? – Blender

+1

Почему вы устанавливаете 'self.x' и' self.y' равным 0 в вашем методе? Это не имеет никакого смысла. Подумайте, что это значит. –

+0

@Blender это явно задание. Использование getters и seters тоже не очень хорошая идея. –

ответ

5

Первая проблема

self.x = 0 
self.y = 0 

Вы просто установить текущую точку в начало координат. Не делай этого. Расстояние от начала координат затем будет 0 ...

Вторая проблема Point(x) и Point(y) не как получить значения для self.x и self.y.

Затем наклон просто «поднимается над пробегом». Кроме того, вы хотите вернуть None, когда self.x == 0.

Так, просто

def slopeFromOrigin(self): 
    if self.x == 0: 
     return None 
    return self.y/self.x 

Или даже

def slopeFromOrigin(self): 
    return None if self.x == 0 else self.y/self.x 

Или пусть Python возвращения None по себе

def slopeFromOrigin(self): 
    if self.x != 0: 
     return self.y/self.x 

Я думаю, что ваша путаница заключается в том, что вы думаете вам нужно как-то определить «происхождение», , Если вам необходимо сделать это, вы бы вместо того, чтобы иметь этот

origin = Point(0,0) 
Point(-6, 0).slopeFromPoint(origin) 
+0

Намного проще, чем я ожидал. Спасибо за помощь/объяснение. – Sean

+0

Не могли бы вы объяснить, как self.y и self.x представляют собой рост и запуск? – Sean

+0

Вы перемещаете шаги 'self.y', чтобы« подняться »(перемещение вверх/вниз) и переместить шаги' self.x' для «запуска» (перемещение вправо/влево). Отрицательный/положительный выбирает направление. –

2
 if (Point(x) - self.x) == 0: 

     return None 

    else: 

     return (Point(y) - self.y)/(Point(x) - self.x) 

As you can see, I'm trying to say that we need the first parameter of Point to be x2, and the second parameter of Point to be y2. I tried it this way and got

NameError: name 'y' is not defined on line 32.

Вы пытаетесь получить доступ к значению y, который является глобальной переменной, что вы еще не назначены.

I also tried to get the index values of Point like this:

return (Point[0] - self.y/(Point[1] - self.x)

две задачи:

  1. "Точка" является классом, не является объектом (который является экземпляром объекта).
  2. Даже если вы поставили объект вместо этого, Point не является списком. Чтобы получить доступ к элементу с использованием индекса, такого как variableName[index], класс variableName должен иметь реализацию для __getitem__(self, key). Например:

    >>> class GoodListClass: 
    ...  def __init__(self, list): 
    ...   self.myList = list 
    ...  def __getitem__(self, key): 
    ...   return self.myList[key] 
    ... 
    >>> class BadListClass: 
    ...  def __init__(self, list): 
    ...   self.myList = list 
    ... 
    >>> someList = range(10) 
    >>> goodListObject = GoodListClass(someList) 
    >>> badListObject = BadListClass(someList) 
    >>> print(goodListObject[2]) 
    2 
    >>> print(badListObject[2]) 
    Traceback (most recent call last): 
        File "<stdin>", line 1, in <module> 
    AttributeError: BadListClass instance has no attribute '__getitem__' 
    
+0

Ваше второе объяснение имеет смысл - почему self.y и self.x автоматически представляют (y2 - y1) и (x2 - x1)? – Sean

+0

Их не должно быть (по крайней мере, для вашей реализации). Можете ли вы объяснить, как вы придумали эту мысль? – Caladbolgll

+0

Основываясь на ответе cricket_007, мы возвращаем None, если self.x == 0 else self.y/self.x и он работает. Он просто использовал self.y/self.x, чтобы получить наклон, не так ли? – Sean