Python 类实例上的类声明和操作

Python 类实例上的类声明和操作,python,Python,我跟随《如何像计算机科学家一样思考》一书学习python 我在理解类和对象章节时遇到了一些问题 其中的一个练习是编写一个名为moveRect的函数,该函数接受一个矩形和两个名为dx&dy的参数。它应该通过将dx添加到角点的x坐标和dy添加到角点的y坐标来更改矩形的位置 现在,我不确定我写的代码是否正确。 那么,让我告诉你我想做什么 你能告诉我我做的是否正确吗 首先,我创建了一个类矩形 然后我创建了一个实例 并输入以下详细信息: 坐标x和y的值 矩形的宽度和高度 这是我之前的代码: class R

我跟随《如何像计算机科学家一样思考》一书学习python 我在理解类和对象章节时遇到了一些问题

其中的一个练习是编写一个名为moveRect的函数,该函数接受一个矩形和两个名为dx&dy的参数。它应该通过将dx添加到角点的x坐标和dy添加到角点的y坐标来更改矩形的位置

现在,我不确定我写的代码是否正确。 那么,让我告诉你我想做什么 你能告诉我我做的是否正确吗

首先,我创建了一个类矩形 然后我创建了一个实例 并输入以下详细信息: 坐标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)
但是当我运行这段代码时,它给了我一个属性错误 和:类矩形没有属性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的情况下使用它。

Frob实例,而不是类型

moveRect(rect, dx, dy)

在第一个示例中,您将类作为参数而不是创建的实例传递。由于类
矩形中没有
self.x
,因此引发了错误

您可以将函数放入类中:

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))

必须指定要在类声明中访问和使用的成员和方法。在类中,您当前正在处理的实例通过名称
self
引用(请参见下面的链接!):

然后实例化类并使用返回的对象:

 r = Rectangle()
 r.x = 5
 r.y = 10
 r.width = 50
 r.height = 10
 r.move(25, 10)
希望有帮助


阅读:

在不让事情变得过于复杂的情况下,让代码正常工作所需的只是更改

moveRect(Rectangle,dx,dy)

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

考虑到您正在阅读的内容希望您在完成此任务时具备的知识,您已经正确地完成了该问题。


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

嗯,我不明白你的意思。我应该将self.x?@faraz放在构造中的什么位置。基本上,当您创建类的实例时,
\uuuuu init\uuuu
块将运行(它是initialise的缩写);)但是矩形.x或矩形.x不是和self.x一样吗?至于init,他们没有在类和对象一章中介绍它,即第12章。嗯,我想我理解了。我应该把对象/实例作为参数而不是类。嗯,明白了。@faraz是的,是一样的,但我的代码只是把它清理了一下:p.我真的不明白。它说这是一个Frobs的图像库在moveRect方法中,传递一个类,而不是传递一个矩形类型的对象。这就是为什么不能调用Rectangle.x,Rectangle.y的原因。所以,你的意思是我应该传递rect而不是Rectangle,对吧?没错!如果你想使用你所做的,但公认的答案也是..一个好答案:)你把类变量和实例变量弄混了。老实说,我只在这个例子中使用类变量(或者我认为是这样)。你能指出我把它们混在哪里了吗?谢谢。@flexy:在第二个块中,您正在创建实例变量来屏蔽类变量。你应该始终使用实例变量。谢谢你的建议,我更正了我的回答以反映这一点。嗯,好吧,我想我知道我做错了什么。你的解释很简单,很有帮助。谢谢
moveRect(Rectangle,dx,dy)
moveRect(rect, float(dx), float(dy))