类声明和类实例的操作

时间:2013-07-02 08:08:39

标签: python

我正在关注“如何像计算机科学家那样思考”来学习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的情况下进行。

4 个答案:

答案 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