我正在关注“如何像计算机科学家那样思考”来学习python 并且在理解类和对象章节时遇到了一些问题。
那里的一个练习是写一个名为moveRect的函数,它接受一个名为dx&的Rectangle和2个参数。 DY。它应该通过将dx添加到角的x坐标和dy到角的y坐标来改变矩形的位置。
现在,我不确定我写的代码是否正确。 所以,让我告诉你我想做什么 你可以告诉我,我做得对吗?
首先我创建了一个Rectangle类 然后我创建了它的一个实例 并输入了诸如的细节 坐标x和y的值 和矩形的宽度和高度。
所以,这是我之前的代码:
class Rectangle:
pass
rect=Rectangle()
rect.x=3.0
rect.y=4.0
rect.width=50
rect.height=120
def moveRect(Rectangle,dx,dy):
Rectangle.x=Rectangle.x + dx
Rectangle.y=Rectangle.y + dy
dx=raw_input("enter dx value:")
dy=raw_input("enter dy value:")
moveRect(Rectangle,dx,dy)
但是当我运行此代码时,它给了我一个属性错误 和:类Rectangle没有属性x
因此,我将以下行移至moveRect函数
rect=Rectangle()
rect.x=3.0
rect.y=4.0
rect.width=50
rect.height=120
因此代码成了:
class Rectangle:
pass
def moveRect(Rectangle,dx,dy):
Rectangle.x=Rectangle.x + dx
Rectangle.y=Rectangle.y + dy
rect=Rectangle()
rect.x=3.0
rect.y=4.0
rect.width=50
rect.height=120
dx=raw_input("enter dx value:")
dy=raw_input("enter dy value:")
moveRect(Rectangle,dx,dy)
但是,这段代码仍然给我一个错误。 那么,这段代码实际上有什么问题呢? 目前,我觉得我好像是用反复试验编写了这段代码, 当我看到错误时改变了部件。我想要正确理解 这是如何运作的。所以,请对此有所了解。
“如何像计算机科学家一样思考”这本书在第12章中没有介绍init,因此我需要在不使用init的情况下进行。
答案 0 :(得分:6)
在第一个示例中,您将类作为参数传递,而不是您创建的实例。由于类self.x
中没有Rectangle
,因此引发了错误。
你可以把这个功能放在课堂上:
class Rectangle:
def __init__(self, x, y, width, height):
self.x = x
self.y = y
self.width = width
self.height = height
def moveRect(self, dx, dy):
self.x += dx
self.y += dy
rect = Rectangle(3.0, 4.0, 50, 120)
dx = raw_input("enter dx value:")
dy = raw_input("enter dy value:")
rect.moveRect(float(dx), float(dy))
答案 1 :(得分:4)
如果没有过于复杂的事情,那么让代码工作所需的只是改变
moveRect(Rectangle,dx,dy)
到
moveRect(rect, float(dx), float(dy))
(您需要确保将每个字符串从raw_input
转换为数字。在moveRect
中,您将Rectangle.x
添加到dx
,这两个值必须是相同类型或您将获得TypeError
。)
鉴于您在完成此book时期望您正在阅读的exercise,您已正确完成该问题。
正如其他人所说,这不是你可能用来解决这个问题的方法。如果继续阅读,您将看到将函数作为类定义的一部分(作为方法)的方法;将数据和对这些数据进行操作的函数捆绑在一个单元中更有意义。
答案 2 :(得分:2)
Frob实例,不是类型。
moveRect(rect, dx, dy)
答案 3 :(得分:2)
您必须在类声明中指定要访问和使用的成员和方法。在课程内部,您正在使用的实例名称为self
(请参阅下面的链接!):
class Rectangle:
def __init__(self):
self.x = 0
self.y = 0
self.width = 50
self.height = 30
# may I recommend to make the moveRect function
# a method of Rectangle, like so:
def move(self, dx, dy):
self.x += dx
self.y += dy
然后实例化您的类并使用返回的对象:
r = Rectangle()
r.x = 5
r.y = 10
r.width = 50
r.height = 10
r.move(25, 10)
希望有所帮助。
阅读:http://www.diveintopython.net/object_oriented_framework/defining_classes.html