3

我对类定义及其使用有一个一般性的问题。其中一本书的以下代码可以正常工作,但我有一个一般性问题。

在这里,我们定义了一个 Point 类并创建了 2 个实例 Point1 和 Point2。在计算point2的距离时,我们如何传递point1对象?

point1 不是点对象,而 other_point 被表示为变量。

我有点困惑。

代码:

import math
class Point:
    def move(self, x, y):
        self.x = x
        self.y = y
    def reset(self):
        self.move(0, 0)
    def calculate_distance(self, other_point):
        print("Inside calculating distance")

        return math.sqrt(
                (self.x - other_point.x)**2 +
                (self.y - other_point.y)**2)

point1 = Point()
point2 = Point()
point1.reset()
point2.move(5,0)
print(point2.calculate_distance(point1))                    
4

4 回答 4

5

当您创建一个Point对象时,会发生几件事。

point1 = Point()
point2 = Point()

发生的一件事是任何属于Point该类的方法都是绑定的。这意味着方法中的参数之一是固定的,因此它始终引用创建的实例。我们来看看 的定义calculate_distance

def calculate_distance(self, other_point):
    print("Inside calculating distance")

    return math.sqrt(
            (self.x - other_point.x)**2 +
            (self.y - other_point.y)**2)

您可能会猜到哪个参数是固定的。当Point()被调用并创建实例时,self参数 ofcalculate_distnace是固定的,因此它始终引用该实例。所以每当你这样做时:

point1.calculate_distance(x)

你正在做相当于这个:

Point.calculate_distance(point1, x)

每当你这样做时:

point2.calculate_distance(point1)

你正在做相当于这个:

Point.calculate_distance(point2, point1)
于 2012-06-18T23:38:46.887 回答
2

这就是self变量的作用。因此,当您在一个类的定义中时,您可以使用它self来标识您正在尝试操作其数据的对象。

例如,假设您有一个名为 human 的类(它有一个名为 的成员变量age),并且每年,您都希望通过调用该increment_age函数来增加该人的年龄。然后,您可以编写以下代码:

class Human:
    def __init__(self):
        self.age = 0

    def increment_age(self):
        self.age += 1

>>> h = Human()
>>> print h.age
0
>>> h.increment_age()
>>> print h.age
1

所以你看,通过调用self,你指的是对象本身。在您的示例中,这将转化为self引用point1.

现在,假设在Human类中,我们要添加一个允许两个人打架的功能。在这种情况下,一个人将不得不与另一个人战斗(假设与另一个人战斗会使您的生命增加一个,而另一个人的生命减少一个)。在这种情况下,您可以在类中编写以下函数Human

def fight(self, other_human):
    self.age += 1
    other_human.age -= 1

现在:

>>> h1 = Human()
>>> h2 = Human()
>>> h1.age = 5
>>> h2.age = 3
>>> print h1.age
5
>>> print h2.age
3
>>> h1.fight(h2)
>>> print h1.age
6
>>> print h2.age
2

因此,您可以在此示例中看到h2函数other_human中的fight

希望有帮助

于 2012-06-18T23:55:01.867 回答
1

给定您的代码,使用as引用的对象和as引用的对象进行point2.calculate_distance(point1)调用。calculate_distancepoint2selfpoint1other_point

了解这类事情的一个好方法是使用可视化调试器,并在调用时检查堆栈帧中的值。

于 2012-06-18T23:34:05.250 回答
0

Insidecalculate_distanceother_point用于引用作为参数传递的任何对象的名称。

于 2012-06-18T23:35:06.773 回答