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

时间:2019-03-28 23:30:36

标签: python class methods scope nameerror

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

所以我的angle_points()方法分别从x_value()和y_value()获得两个点,但是由于某种原因,我无法从矩形_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()也会遇到同样的问题。

3 个答案:

答案 0 :(得分: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()))

答案 1 :(得分: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以避免膨胀和可能的错误< / p>

答案 2 :(得分:-2)

您如此亲密!

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

如果第一个参数应该为self

def x_value(self):

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

print可能不应该缩进,但这无关紧要