2016-03-24 81 views
-1

我在codewars上創建一個簡單的類時遇到了問題。我收到以下錯誤:init 3.5函數中的Python 3.5錯誤沒有引用足夠的參數

Traceback: in TypeError: __init__() takes exactly 3 arguments (2 given)

我意識到我與self參數一起使用兩個參數提供的初始化函數。當我從我的課創建我的對象時,我爲這兩個參數提供了兩個字符串。我不確定我在做什麼錯。它是codewars瀏覽器嗎?我很感激任何幫助。請看下面:

class Person: 

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

    def greet(self): 
     return "Hi {0}, my name is {1}".format(self.other_name, self.name) 

xy = Person("Raiden", "Donald") 
xy.greet() 

我已經檢查了關於這個問題的其他問題,它似乎總是問題是,調用類的人沒有必要的參數提供它。不過,我正在那樣做。我很感激任何幫助。

編輯************

值得注意的是,我可以在生產我的正常的Python IDLE上面的代碼。我在codewars窗口中有完全相同的代碼。她的原始codewars問題: 更正此代碼,以便greet函數返回期望值。

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

    def greet(self, other_name): 
    return "Hi {0}, my name is {1}".format(other_name, name) 
+1

無法在Python 3.5.1上重現 – vaultah

+1

你在做什麼代碼大戰的問題。你能發佈鏈接嗎?另外,你確定這是Codewars編輯器窗口中的所有代碼嗎? – idjaw

+0

我編輯了我的原始評論,以包含原始codewars開始代碼加上問題。值得注意的是,我可以重現我在IDLE中張貼的原始代碼,沒有任何錯誤。 – raidboss

回答

1

Codewars問題給你你需要更正的代碼。當你提交它時,它會運行一系列由問題創建者定義的單元測試。這裏是原代碼:

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

    def greet(self, other_name): 
    return "Hi {0}, my name is {1}".format(other_name, name) 

提交此代碼時,你所得到的錯誤是:

Traceback: 
    in 
    in greet 
NameError: global name 'name' is not defined 

因此,與該錯誤消息,通過分析代碼,你會發現,在greet方法,你實際上正在嘗試使用實際上從未定義過的變量name

這實際上是您需要修復的錯誤。您試圖在您的init中添加一個額外的變量。所以,發生了什麼事情,是針對您的代碼運行的單元測試,期望只有一個值被傳遞給您的init

解決此問題的方法是簡單地將greet方法中的name更改爲self.name,以便它使用實例屬性。所以你的最終代碼是非常多的:

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

    def greet(self, other_name): 
    return "Hi {0}, my name is {1}".format(other_name, self.name) 
+0

哇,非常感謝。我從來沒有抓到過。我會繼續嘗試並通過添加更多代碼並考慮敲擊鍵盤來使問題複雜化。謝謝您的詳盡信息。非常感謝:) – raidboss

+0

@raidboss你非常歡迎。與Codewars玩得開心。這很棒。如果這對你有幫助,請確保你註冊並接受答案。它有助於下一個尋求類似幫助的人知道這是有幫助的。歡呼聲,祝你好運! – idjaw

+0

我的不好,我檢查了兩個,因爲他們都在技術上回答了這個問題。我不知道只有一張支票可以申請。我標記了你的答案,因爲這是一個很好和徹底的解釋。希望別人能從中受益。再次感謝! – raidboss

0

Codewars正運行在你的代碼的測試用例來看看你是否在固定給定的代碼成功。所有這些測試用例都假定Person構造函數帶有一個位置參數。由於您將Person.__init__的簽名更改爲需要兩個位置參數,因此每個測試用例都會拋出報告TypeError

要糾正提供的代碼,請考慮在greet方法中是否存在名爲name的局部變量。

+0

非常感謝:) – raidboss