2012-06-18 137 views
3

我對類定義及其用法有一個普遍的疑問。下面的代碼來自一本書的工作正常,但我有一個一般性的問題。Python類 - 需要說明

這裏我們定義了一個類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))      
+0

這個網站是不是指導。請閱讀關於python類,對象和方法的教程。 – Marcin

+8

Aww來吧!這是一個編程論壇,這個人看起來是python的新手。此外,這不會是第一次在SO上提出輔導式問題。 – inspectorG4dget

+0

@ inspectorG4dget既不是第一次也不是最後一次,但我認爲阻止它們是正確的。 – Marcin

回答

2

這就是變量是。因此,當您處於某個類的定義範圍內時,可以使用self來標識您試圖操作其數據的對象。

例如,假設您有一個名爲human的類(它具有名爲age的成員變量),並且每年都希望通過調用increment_age函數來增加該人的年齡。通過調用self,你指的是物體本身

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,指的是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 

因此,你可以在這個例子中看到,h2fight功能other_human

希望可以幫到

1

鑑於你的代碼,point2.calculate_distance(point1)電話calculate_distancepoint2簡稱爲self對象,該對象提到了point1other_point

瞭解這些事情的一個好方法是使用可視化調試器,並在調用時檢查堆棧幀中的值。

0

Inside calculate_distanceother_point是用來指任何對象作爲參數傳遞的名稱。

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參數calculate_distnace已修復,因此它始終引用該實例。所以每當你這樣做:

point1.calculate_distance(x) 

你做的這相當於:

Point.calculate_distance(point1, x) 

,只要你做到這一點:

point2.calculate_distance(point1) 

你做的這相當於:

Point.calculate_distance(point2, point1)