2013-08-28 30 views
-1

我在使用python版本3.3.2時不斷收到這個錯誤,我沒有做任何事情,我正在看YouTube上的教程並嘗試過,但是他的版本使用2.7AttributeError:type object'challee'has no attribute'display'

>>> class challee: 
def cname(self,name): 
    self.name = name 
    def display(self): 
     return self.name 
    def say(self): 
     print("help %s" % self.name) 


>>> challee 
<class '__main__.challee'> 
>>> first = challee 
>>> second = challee 
>>> first.cname(first,"becky") 
>>> second.cname(first,"tony") 
>>> first.display() 
Traceback (most recent call last): 
    File "<pyshell#13>", line 1, in <module> 
    first.display() 
AttributeError: type object 'challee' has no attribute 'display' 
+0

也許是縮進問題。你的兩個方法可能被當作方法'cname()'處理。 –

+0

與縮進問題無關,您的代碼有另一個錯誤。你需要創建'challee'的實例,而不是使用類來完成所有的事情。 (Python 2.7會抓住這一點,但3.x行中的簡化刪除了該檢查。) – user2357112

+0

您的權利它是縮進問題,我縮進了太多。 –

回答

1

您縮進displaysay方法太遠;它們是challee類的內部的嵌套函數

請注意,您從不製作實例;而是創建對該類的多個引用。 呼叫 *類產生一個實例:

first = challee() 
second = challee() 

,然後你不必在一個明確的說法傳爲self之一:

first.cname('becky') 
+0

我解決了這個問題,感謝這是縮進問題,我不得不爲自身使用明確的參數,以便first.display顯示'becky' –

0

如果你調用一個方法上的一個實例,正如Martijn的例子,self參數會在通話時自動添加。所以,爲你的類:

class challee: 
    def cname(self,name): 
     self.name = name 
    def display(self): 
     return self.name 
    def say(self): 
     print("help %s" % self.name) 

你需要做一個類的實例,然後調用你的方法對,像他證實:

a = challee() 
a.cname('Becky') 

由於這無形中傳遞的實例作爲self參數,它是等效於調用該方法針對類(其不隱含任何傳作爲self),並用手在該實例傳遞:

a = challee() 
challee.cname(a, 'Becky') 

問題是傳入類爲self時出錯,它必須是實例。

您可以創建不需要一個實例來操作,通過使用@staticmethod裝飾的功能:如果你定義了這樣的方法

class challee: 
    @staticmethod 
    def say(whatever): 
     print(whatever) 

,自不需要作爲參數在一切,你會打電話像這樣的功能:

challee.say("this is a test") 

或像這樣:

a = challee() 
a.say("this is a test") 

然而,這兩個電話會做同樣的事情。

相關問題