2017-06-01 236 views
3

我在學習Python,目前正在使用類。我正在嘗試做一個基本的遊戲來幫助學習它,並從它調用方法 有一個奇怪的問題。我有main.py文件,該文件從Character.py文件的類中創建一個實例。爲什麼我不能從我的Python類中調用方法?

這是Character.py文件:

class Character: 
    name="" 

    def __init__(Name): 
     name=Name 

    def getName(): 
     return name 

這是main.py文件:

from Character import * 

player = Character("James") 
print(player.getName()) 

我不知道是什麼問題。這是我得到的錯誤:

Traceback (most recent call last): 
    File "C:\Users\dstei\Documents\Python\It 102\Final Project\Main.py", line 
12, in <module> 
    print(player.getName()) 
TypeError: getName() takes 0 positional arguments but 1 was given 

這是說我給1位置的論點,但我沒有看到我給了什麼。我錯過了什麼?

回答

8

由於您有一個帶有實例方法的類,因此您需要包含第一個參數(通過約定self)來引用當前實例。此外,確保設置變量作爲一個實例變量使用self,當前實例:

class Character: 
    def __init__(self, Name): #self is the current instance 
     self.name=Name #set the variable on the instance so that every instance of Character has a name 

    def getName(self): 
     return self.name #refer to the name with the instance 

Python的內部將一個類作爲第一個參數的所有類方法的新實例,像this用Java等語言編寫。錯誤來自於Python在內部傳遞實例作爲第一個參數的事實,但是您的getter沒有被定義爲接受參數。

通過上面的代碼,當你在一個實例上調用該方法時,實例在內部作爲第一個參數傳遞,Python不會抱怨,因爲你指定了一個參數,selfname設置正確該實例。


注:按照慣例,Python不使用駝峯,但強調,所以你應該吸氣按照慣例是這樣的:

def get_name(self): 
    #... 

另請參閱chepner's answer這就解釋了爲什麼getter和setter不通常需要。只需使用點符號獲取並修改實例變量:

print(player.name) #get 
player.name = "Jeff" #set 
+1

和專家發話了,好解釋的,共享的感謝,再加上一個 –

+0

謝謝,製作了一套方法如的setName會是這樣? def setName(newName): self.name = newName –

+0

@ D.Stei每個實例方法都應該包含self作爲它的第一個參數:'def set_name(self,new_name):self.name = new_name' – Li357

0

您忘記添加參數self。 self是對象本身的對象引用,因此它們是相同的。 Python方法不在對象本身的上下文中調用。自我在Python可以用來處理自定義對象模型或

class Character: 

    def __init__(self,name): 
     self.name=name 

    def getName(self): 
     return self.name 

要了解爲什麼需要這個參數,這裏還有這麼好的答案:

What is the purpose of self?

4

正如其他人所說,即使實例方法必須聲明一個額外的參數,通常名爲self(雖然這是一個傳統的,而不是必需的名稱)。

class Character: 
    def __init__(self, name): 
     self.name = name 

    def get_name(self): 
     return name 

然而,Python沒有任何形式的強制可見性(如公共或私有)的,所以這些瑣碎的getter和setter通常不被寫入。關於您「允許」修改哪些屬性的文檔被認爲是足夠的保護。

class Character: 
    def __init__(self, name): 
     self.name = name 

c = Character("Bob") 
print(c.name) # instead of c.get_name() 
c.name = "Charlie" # instead of c.set_name("Charlie") 
+0

啊,是的,我沒有提到這一點。 +1 – Li357

+0

嗯,這是很好的知道,謝謝。這是否也適用於列表? –

相關問題