3

我正在按照“如何像计算机科学家一样思考”这本书来学习 python,并且在理解类和对象章节时遇到了一些问题。

那里的一个练习说要编写一个名为 moveRect 的函数,该函数接受一个 Rectangle 和 2 个名为 dx& 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 的情况下这样做。

4

4 回答 4

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))
于 2013-07-02T08:10:03.190 回答
4

无需过度复杂化,您只需更改代码即可

moveRect(Rectangle,dx,dy)

moveRect(rect, float(dx), float(dy))

(您需要确保将每个字符串 fromraw_input转换为数字。在moveRect中,您添加Rectangle.xdx,这两个值必须是相同的类型,否则您将得到一个TypeError。)

鉴于您正在阅读的希望您在完成本练习时具备相关知识,因此您已正确完成了该问题。

正如其他人所说,这不是您可能用来解决此问题的方法。如果您继续阅读,您将看到将函数作为类定义的一部分(作为方法)包含在内的方法;将数据和对该数据进行操作的函数捆绑到一个单元中更有意义。

于 2013-07-02T09:19:20.920 回答
2

Frob 实例,而不是类型。

moveRect(rect, dx, dy)
于 2013-07-02T08:09:49.787 回答
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_orient_framework/defining_classes.html

于 2013-07-02T08:12:28.267 回答