2013-08-30 96 views
1

我想了解類,有人可以向我解釋爲什麼這段代碼不工作。我想當從一個類中調用一個函數時,「self」會自動省略,但解釋器告訴我缺少了參數「a」(他認爲self = 10)。Python 3:從類,自我調用函數

#! coding=utf-8 
class test: 
    def __init__(self): 
     "do something here" 
    def do(self,a): 
     return a**2 

d = test.do 
print(d(10)) 

回答

3

你必須先初始化類:

d = test() 

,那麼你可以調用一個方法:

print(d.do(10)) 
+0

-1,這不是有效的Python 3 – unwind

+0

@unwind - 以什麼方式? – Random832

2

,如果你想使用方法靜態你有蟒蛇

#! coding=utf-8 
class test: 
    def __init__(self): 
     "do something here" 

    @staticmethod 
    def do(a): 
     return a**2 

d = test.do 
print(d(10)) #and that's work 
0

宣佈它,因爲你還沒有實例化的類(用於創建看中的術語),你不能分配方法,任何隨機變量。就像已經說過的那樣,您必須先創建對象,同時確保您調用的方法是您調用的類的一部分或以某種方式連接到類(例如創建另一個類,然後將該類與當前類進行通信) 。所以你應該先輸入d=test(),然後輸入d.do()。 另外,請記住,在您的方法聲明中,您創建了一個參數,因此無論如何,您所做的都是錯誤的,因爲當您聲明do函數時,應該在括號內放入要發送給方法的數字計算其平方。所以你輸入test.do(10),然後通過自我引用發送10來完成你要做的任何事情。

還有一件事:儘管這不是一個大問題,但是如果所有的類名都以大寫字母開頭,這很有幫助,因爲這通常是「pythonic」做事的方式,它也會使您的代碼更容易閱讀,因爲當你第一次調用的類,有人可以很容易誤認爲是一個普通的功能

0
class test: 
    def __init__(self): 
     "do something here" 
    def do(self,a): 
     return a**2 
    def __call__(self,a): 
     return self.do(a) 

a = test 
test.do(a,10) 
#or 
a = test().do 
a(10) 
#or 
a = test() 
test.do(a,10) 
#or 
a = test() 
print(a(10))