2013-12-23 28 views
1

我知道它的愚蠢問題,但我試圖掌握Python中OOP的概念。假設我想要寫階乘的程序程序形式,我會做這樣的事情Python中面向對象的例子

def factorial(n): 
    num = 1 
    while n >= 1: 
     num = num * n 
     n = n - 1 
    return num 

f = factorial(3) 
print f # 6 

現在我想重寫OO方式相同的階乘的程序。我沒有得到如何使用對象和類編寫這個相同的功能。

class Factorial(): 
    def fact(n): 
     num = 1 
     while n >= 1: 
      num = num * n 
      n = n - 1 
     return num 

f = Factorial() 
a = f.fact(3) 
print a # TypeError: fact() takes exactly 1 argument (2 given) 

我知道更確切地說功能方式使用lambda表達式和其他的東西可以做到這一點,但我正在學習面向對象的概念。我做錯了什麼?

回答

3

當您調用實例方法時,默認情況下當前對象作爲第一個參數傳遞給該函數。在你的情況,

def fact(n): 

,當你調用它

a = f.fact(3) 

它會像這樣

a = fact(f, 3) 

爲什麼目前的對象傳遞時,讓究其原因實際處理實例方法會更改對象。 (請記住Python沒有其他關鍵字,如this,就像其他一些語言一樣)。

但是你的函數的簽名不符合這個(它只需要一個參數)。這就是爲什麼它是扔

# TypeError: fact() takes exactly 1 argument (2 given) 

爲了解決這個問題,你要簽名更改爲類似這樣

def fact(self, n): 

現在,self參數將接收傳遞當前對象。

+0

真棒解釋,謝謝。 – ajkumar25

+0

@ user3012137歡迎您:)如果可以幫助您,請考慮接受此答案http://meta.stackexchange.com/a/5235/235416 – thefourtheye

2

你忘了self參數:

class Factorial(): 
    def fact(self,n): #Forgot the self parameter huh? 
     num = 1 
     while n >= 1: 
      num = num * n 
      n = n - 1 
     return num 

我建議你閱讀這些太:

+0

呃,我明白了。這**自我**是令人困惑的。 – ajkumar25

+0

也可以考慮:class Factorial(Object):它的工作原理沒有這樣做。 – Tony

+0

@ user3012137 ikr,發佈一些鏈接一定要檢查他們... –