2016-08-12 127 views
0

我的問題是爲什麼我無法讓類的對象給它一個整數作爲參數。它完全忽視了我作爲參數傳遞給它的價值。然而,如果我從類中調用區域函數並將相同數字傳遞到它的括號中,它將輸出所需的結果144.爲什麼這個類的方法沒有這個參數?

從我目前閱讀的內容中,我最好的猜測是類函數的方式是編碼是不正確的,我希望它會實現。我是否需要將區域函數看作如下參數:self.length

# -*- coding: utf-8 -*- 
class square: 
    sides = 4 
    def __init__(self, length): 
     self.length = length 
    def area(self, length): 
     return length * length 

box = square(12) 
print(box.area()) 

輸出:TypeError: area() missing 1 required positional argument: 'length'

不應該被保存所賦予它爲對象的生活的持續時間值創建的對象?爲什麼當我告訴它如果打電話看起來像這樣再次從area方法打印時會拋出另一個錯誤?

print(box.area(12)) 
output:144 
print(box.area()) 
output: <bound method square_shape.area of <__main__.square_shape object at 0x7f5f88355b70>> 

我很抱歉,如果這個問題是一個有點古怪的措辭,但我只是在尋找儘可能多的信息,我可以得到,並試圖更好地瞭解我在做什麼這裏。關於這個問題的其他問題並沒有很好地理解我想要弄清楚什麼。

回答

4

你在考慮self.length。長度(前面沒有「自我」)只是一個局部變量。如果它是一個論點,你需要提供它。

你可能想要的是: def area(self): return self.length * self.length

+0

所以,如果我的理解正確,那麼長度是這個對象的局部變量,我做某事的方式是以某種方式將它視爲一個全局變量? – Ragecoder

+0

也許吧?如果你正在考慮它,那麼你當前的術語是關閉的。長度是一個實例字段。還有一個長度局部變量。 「局部變量」是指本身的作用域。一旦區域完成並返回一個值,則不再定義作爲局部變量的「長度」。但是self.length,只要你處理這個對象的特定實例,實例字段就會保持它的值。 –

+0

你先生是個巧妙的人。你能否評論一下,以自我爲參數的功能究竟是如何導致這種巫術的?當它通過自我時,它是否將創建對象時傳遞的所有參數傳遞給區域函數? – Ragecoder

1

area採取self說法,這足以訪問self.length

... 
def area(self): 
    return self.length * self.length 

然後就可以調用square(3).area()並獲得9

您當前的聲明需要明確的長度參數,類似square(3).area(4)這將產生16

一個OOP的關鍵原則之一是方法訪問對象(或常說實例的)狀態,並且可以在該狀態下工作,而不是傳遞明確。

在Python中,通常使用參數self將相關對象傳遞給方法。 area方法在squarelength上運行;您以self.length的身份訪問它。那selfsquare的一個實例,例如square(3)返回。