【问题标题】:How is value assigned to "other" variable in this Python Class?如何为这个 Python 类中的“其他”变量赋值?
【发布时间】:2019-08-08 11:20:56
【问题描述】:

我正在学习这门 Python Edx 课程,下面是介绍 OOP 时给出的示例之一。这是一个基本问题,你们很多人会否决它,但在我继续之前我需要了解这一点。

我已经在 Reddit 上搜索过,也在 Edx 论坛上问过这个问题,但还是不明白。我也在这个网站上搜索过这个特定的编码示例。

Reddit:https://www.reddit.com/r/learnpython/comments/a54y04/explanation_needed_on_a_simple_class_creation/

class Coordinate(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def distance(self, other):
        x_diff_sq = (self.x-other.x)**2
        y_diff_sq = (self.y-other.y)**2
        return (x_diff_sq + y_diff_sq)**0.5

point1 = Coordinate(1,2)
point2 = Coordinate(3,4)

print(point1.distance(point2))

我想了解的是程序如何确定“other.x”值?因为我无处为 other.x 和 other.y 赋值。

对于 self.x 和 self.y,有一个明确的赋值发生,但对于“other.x”和“other.y”没有这样的赋值。程序如何将“3”分配给“other.x”,将“4”分配给“other.y”?

【问题讨论】:

  • 程序创建point1point2,然后调用point1.distance(point2)。在这种情况下,point2 是为方法 distance 的参数 other 传递的参数,并且分别为 .x.y 包含 3 和 4。

标签: python class oop


【解决方案1】:

other 只是方法 distance 所采用的参数。隐含地期望此参数具有xy 属性。它们是否真的存在或被分配与distance 方法无关。

程序如何将“3”分配给“other.x”,将“4”分配给“other.y”?

同样,如前所述,other 只是函数参数的名称。让我们看看你调用函数的唯一地方:

print(point1.distance(point2))

这被解释为self.distance(other),因此我们可以得出结论,在这种特殊情况下,other 是对象point2

现在,让我们返回几行查找point2 的任何引用。这里是:

point2 = Coordinate(3,4)

在执行Coordinate(3,4) 时,我们正在调用该类的__init__ 方法。因此,在该方法中,我们将x 分配给3,将y 分配给4

所以你是对的,other.xother.y 没有明确的赋值,但 other 并不是一个真正的对象,而是一个参数。因此,您必须了解它是用于特定函数调用的对象,以及它被分配到的位置。


不要让参数名称混淆您!

对于 self.x 和 self.y,发生了显式赋值

这也不完全正确。是的,后面几行有一个赋值给self,但这只是两个不同函数参数的同名。代码可以这样写,仍然可以正常工作:

class Coordinate(object):
    def __init__(obj, x, y):
        obj.x = x
        obj.y = y

    def distance(one, two):
        x_diff_sq = (one.x-two.x)**2
        y_diff_sq = (one.y-two.y)**2
        return (x_diff_sq + y_diff_sq)**0.5

在这里你会说没有明确分配给one。但这一切都取决于每个函数的每次调用,传递的参数是什么。

【讨论】:

  • 这是一个很好的解释。 “隐含地期望这个参数是坐标类型的,所以它会有 x 和 y 属性。” - 所以这意味着每当一个方法(除了init)在一个类中定义时,该方法的参数总是与类的类型相同?我说的对吗?
  • 没有。对不起,如果我误导了你。我将尝试澄清解释。只是期望这些对象将具有xy 属性(因为我们正在显式访问它们......)
  • 您关于“参数名称的部分让您感到困惑!”是什么帮助了我。因此,当我调用“距离”方法时,实际发生的是 point1 和 point2 的数据属性被分配给“一”和“二”(参考您的代码)。所以现在“一”和“二”的数据属性与point1和point2的数据属性完全相似。这是正确的吗?
  • 是的。 one 是对与point1 相同对象的引用,two 是对与point2 相同对象的引用。所以这就是为什么在做one.x 等时你会得到预期的数据
猜你喜欢
  • 2012-02-02
  • 2016-01-24
  • 2020-06-20
  • 2016-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-28
  • 1970-01-01
相关资源
最近更新 更多