2010-04-13 43 views
1

我剛剛開始學習python。我寫了一個示例腳本來測試Python中的OOP,但發生了一些非常奇怪的事情。當我調用一個類方法時,Python正在用比給定的多一個參數調用該函數。Python調用具有錯誤參數數量的類方法

下面是代碼:


1. class Bar: 
2. num1,num2 = 0,0 
3. def __init__(num1,num2): 
4. num1,num2 = num1,num2 
5. def foo(): 
6. if num1 > num2: 
7.  print num1,'is greater than ',num2,'!' 
8. elif num1 is num2: 
9.  print num1,' is equal to ',num2,'!' 
10. else: 
11. print num1,' is less than ',num2,'!' 
12. a,b = 42,84 
13. t = Bar(a,b) 
14. t.foo 
15. 
16. t.num1 = t.num1^t.num2 
17. t.num2 = t.num2^t.num1 
18. t.num1 = t.num1^t.num2 
19. 
20. t.foo 

和錯誤消息我得到:


python test.py 
Traceback (most recent call last): 
    File "test.py", line 13, in 
t = Bar(a,b) 
TypeError: init() takes exactly 2 arguments (3 given) 

誰能幫助?
在此先感謝

回答

5

兩件事情:

  1. 你的類名爲Bar但你叫它爲bar(a, b)。將其更改爲Bar(a, b)即可解決此問題。如果沒有,那麼object)。您需要class Bar(object):
  2. Python中的實例方法總是在其他傳遞的參數之前提供一個參數,該參數是對象本身。所以你的def __init__(num1, num2):應該是def __init__(self, num1, num2):,和def foo()一樣。
  3. 所有的實例變量都需要加上前綴self.。所以num1應該是self.num1
  4. ^運算符是布爾XOR。不確定這是否是你想要的,它經常與電力運營商**混淆。

這裏是你的榜樣,清理並相應固定:

class Bar(object): 
    num1, num2 = 0, 0 
    def __init__(self, num1, num2): 
     self.num1, self.num2 = num1, num2 

    def foo(self): 
     if self.num1 > self.num2: 
      print self.num1,'is greater than ',self.num2,'!' 
     elif self.num1 is self.num2: 
      print self.num1,' is equal to ',self.num2,'!' 
     else: 
      print self.num1,' is less than ',self.num2,'!' 

a, b = 42, 84 
t = Bar(a, b) 
t.foo() 

t.num1 = t.num1^t.num2 
t.num2 = t.num2^t.num1 
t.num1 = t.num1^t.num2 

t.foo() 

而結果:

42 is less than 84 ! 
84 is greater than 42 ! 
+0

一對夫婦是兩個;-)然而,所有4個點都是正確的! +1! – mjv 2010-04-13 23:09:09

+0

當我開始寫作時,有兩個,然後我發現了兩個!然後我編輯並找到了一個! :) – bcherry 2010-04-13 23:13:31

+0

我修正了它,但它看起來類不需要繼承。也許我們在這裏使用不同版本的Python 2.6.5 for windows。 – Hussain 2010-04-13 23:23:03

1

Python的標識符是區分大小寫的...吧=酒吧...

此外,您還需要顯式聲明自己爲__init__()方法的第一個參數,喜歡的東西:

def __init__(self, num1, num2): 
    #...etc. 

BTW,看到bcherry的答案,因爲他/她介紹其他典型的Python初學者的錯誤(如用self.沒有明確前綴實例變量...

+0

Woops ...對不起,這是我的錯誤...修正了它。 – Hussain 2010-04-13 23:05:07

7

傳遞給實例方法的第一個參數是實例本身。通常,這種定義函數時被稱爲self

def __init__(self, num1, num2): 

考慮閱讀the tutorial

1

在關於特定的錯誤信息,你錯過了上線3的self爭論它應該閱讀:

def __init__(self, num1,num2): 

不像其他OOP語言實例方法,在Python中,你必須明確地命名當定義這樣的方法時,該實例作爲第一個參數。然後,當您撥打obj.some_method()時,obj會自動且隱式地作爲第一個參數傳遞給some_method

第一個參數是慣用名爲self,但沒有任何東西阻止您將其命名爲其他任何東西。

3

一)按照慣例,一個方法的第一個參數叫做self。

b)在線4你是自分配的。也許你要說self.num1,self.num2

c)如果您想調用T的方法foo(線14和20),你應該在末尾加上括號:t.foo()

d)縮進是通過4個空格慣用的,這使得閱讀更容易。

編輯:你可能想看看Allen Downey的書「Think Python:如何像電腦科學家一樣思考」的第15-18章。這本書很短,寫得很好,而且易於閱讀。它免費提供here。編輯2:我之前沒有注意到這一點,但在下面的評論中指出,在這種情況下,最好如果(在第8行)你使用==而不是相等的比較是。

+0

謝謝,你的建議工作。 – Hussain 2010-04-13 23:23:34

+0

值得注意的是,不像某些/許多?其他語言,'self'參數在Python中是顯式的。因此,除了傳遞給方法的其他參數之外,您的類成員方法還需要有一個「self」參數作爲其第一個參數。然後,如上面的b點所述,自引用也需要是明確的。 – 2010-04-13 23:33:48

相關問題