在类中定义方法时,方法范围是否重要?

问题描述 投票:-1回答:3

我有一个方法返回四个用于创建矩形的变量。但该函数使用另一种方法来获取某些值。

所以我的rectangle_points()方法分别从x_value()和y_value()获取两个点,但由于某种原因,我无法从rectangle_points()内部对x_value()进行函数调用我得到一个NameError:name'x_value'未定义

from random import *

class Rectangle:
    def x_value():
        return choice(range(0, 800, 10))

    def y_value():
        return choice(range(0, 600, 10))

    def rectangle_points():
        x1 = x_value()
        y1 = y_value()
        x2 = x1 + 10
        y2 = y1 + 10
        return x1, y1, x2, y2

    print('for rectangle points are {}'.format(rectangle_points()))

现在的预期结果应该是打印出四个点,但我得到一个NameError:未定义名称'x_value'。 ps我假设如果要到达那一行,我将为y1 = y_value()行得到同样的问题。

python class methods scope nameerror
3个回答
1
投票

根据@JBirdVegas的建议,我想为您提供完整的答案。

from random import choice

class Rectangle:
    def x_value(self):
        return choice(range(0, 800, 10))


    def y_value(self):
        return choice(range(0, 600, 10))


    def rectangle_points(self):
        x1 = self.x_value()
        y1 = self.y_value()
        x2 = x1 + 10
        y2 = y1 + 10
        return x1, y1, x2, y2


r = Rectangle()
print('for rectangle points are {}'.format(r.rectangle_points()))

你必须告诉解释器引用类自己的函数。你可以通过添加self来实现这一目标

通过这种方式,解释器知道它引用自身,即Rectangle.x_value而不仅仅是x_value。正如之前在评论中所建议的那样,我建议您查看文档以获取更多详细信息,但这应该解决您现在遇到的所有问题。

编辑:我想补充一点,使用import *并不总是最好的解决方案,您可以将其更改为from random import choice以避免膨胀和可能的错误,如果库具有相同的命名对象


1
投票

这只是一个快速解决方案。在为类创建方法时,始终在初始化期间调用self。然后,这允许您在创建新方法时使用同一类中的其他方法。这应该修复你的代码!

from random import *

class Rectangle:
    def x_value(self):
        return choice(range(0, 800, 10))

    def y_value(self):
        return choice(range(0, 600, 10))

    def rectangle_points(self):
        x1 = self.x_value()
        y1 = self.y_value()
        x2 = x1 + 10
        y2 = y1 + 10
        return x1, y1, x2, y2
rec = Rectangle()
print('for rectangle points are {}'.format(rec.rectangle_points()))

-2
投票

你真是太近了!!!

只需像self一样添加self.x_value()

如果第一个参数应该是self

def x_value(self):

self表示函数是实例成员而不是类成员。

print可能不应该缩进,但这并不重要

© www.soinside.com 2019 - 2024. All rights reserved.