2014-09-08 3 views
-2

Здравствуйте, я пытаюсь сделать этот прямоугольник перемещенным к определенным координатам без изменения ширины и высоты прямоугольника. Когда я использую метод __str__, я не получаю правильный ответ. Любые идеи, что происходит не так? Вот мой кодPython Класс: moving rectangle

class Rectangle(object): 
    def __init__(self,corner,width,height): 
    self._x = corner[0] 
    self._y = corner[1] 
    self._width = width 
    self._height = height 

def get_bottom_right(self): 
    self._width = self._x + self._width 
    self._height = self._y + self._height 
    return(self._width,self._height) 

def move(self,p): 
    self._p = self._x, self._y 

def resize(self,width,height): 
    resize = self._width + self._height 
    return(resize) 


def __str__(self): 
    return '({0}, {1})'.format((self._x, self._y), (self._x + self._width, self._y + self._height)) 
+2

Что такое «правильный ответ»? Какой ответ вы получаете? Покажите нам данные, которые вы передаете своему экземпляру 'Rectangle'. – dano

+0

В качестве побочного примечания, если у вас возникли проблемы с изменением состояния, возможно, вам следует сначала попытаться написать не мутирующие функции, такие как 'move (self, p)', который возвращает новый 'Rectangle', который является этим один переместился в 'p'. Может быть проще продумать, что происходит в 'return Rectangle (...)', чем в 'self._foo = ...'. – abarnert

ответ

1

Ваша функция move() выглядит неправильно. Он принимает один параметр с именем p (для «пары», я полагаю), и я предполагаю, что он должен переместить прямоугольник в эти координаты. Но он не меняет self._x или self._y.Я думаю, что вы получили ваше задание назад в этой функции, и вы, вероятно, имел в виду сделать:

def move(self,p): 
    self._x, self._y = p 

Это если р кортеж (а (3,4) пара). Если это объект с x и y атрибутов, вы хотите сделать:

def move(self,p): 
    self._x = p.x 
    self._y = p.y 

как кто-то уже указывал.

На самом деле, ваш код имеет несколько других проблем в дополнение к этому. Ваша get_bottom_right() функция изменяет значение self._width и self._height, который не то, что вы собираетесь, и ваша resize() функция не изменения значения self._width и self._height на всех.

... Я вижу, что другие указали на ошибки в ваших функциях move() и resize(), поэтому я займусь функцией get_bottom_right(). Вы, вероятно, хотите сделать это:

def get_bottom_right(self): 
    right = self._x + self._width 
    bottom = self._y + self._height 
    return (right,bottom) 

Обратите внимание, как я только изменил имена переменных, но оставил свой код в противном случае то же самое. Это сделает то, что вы хотите, без, изменяя ширину и высоту вашего прямоугольника в процессе. Ваш исходный код изменил бы ширину и высоту каждый раз, когда вы вызывали get_bottom_right().

+0

Да, это сработало для меня. Спасибо! Теперь я вижу, что мои функции вообще ничего не делали – user3491814

2

Я не уверен, как именно вы хотите, чтобы переместить прямоугольник, но я знаю, что ваши move и resize методы в настоящее время ничего не делает.

В настоящее время метод, который вы используете для перемещения, принимает параметр p, который затем переходит к игнорированию. Затем он создает новое поле внутри вашего прямоугольника с именем _p и устанавливает _p, равный его координатам x и y. Тем не менее, это также бесполезная операция, так как вы никогда не заканчиваете использование _p и потому, что вы никогда не переводили эту переменную.

Вместо этого, вы можете сделать что-то вроде этого:

def move(self, x, y): 
    self._x = x 
    self._y = y 

Теперь, если вы my_rectangle.move(3, 4), х и у координаты my_rectangle будет изменено на 3 и 4.

Если p предназначается, чтобы быть что-то вроде «точечного» объекта, вы, вероятно, хотите сделать это вместо того, чтобы:

def move(self, p): 
    self._x = p.x 
    self._y = p.y 

Точно так же, ваш «размер» м Этод не делает ничего значимого. Вызов будет просто возвращать сумму ширины и высоты вашего прямоугольника, что на самом деле ничего не значит. Вы, вероятно, хотите, чтобы изменить его вместо этого:

def resize(self, width, height): 
    self._width = width 
    self._height = height 
1

Ваш метод move не изменяет право атрибуты, чтобы переместить прямоугольник. Вместо того, чтобы назначать self._p, вы хотите использовать параметр p, измененный для изменения self._x и self._y.

Попробуйте это:

def move(self,p): 
    self._x, self._y = p 

Это перемещает прямоугольник быть в точке p (предполагая, что p является (x,y) кортеж). Если вы хотите переместить поp вместо этого, попробуйте:

def move(self,p): 
    self._x += p[0] 
    self._y += p[1] 

У вас есть аналогичная проблема в методе resize (где вы хотите изменить self._width и self._height, а не добавлять их вместе и вернуть их). Метод get_bottom_right имеет противоположную проблему, так как он изменяет self._width и self._height, когда он, вероятно, не должен.