2012-03-02 74 views
2

我不知道什麼是錯的!這是一個非常簡單的程序,我已經做了很多頭撞!請有人賜教我!在Python 3.x中的TypeError

這是一個來自CSE 111 - 編程語言II課程的實驗室問題。他們在大學教授Java,我用Java編寫的代碼工作正常。

我只需創建一個Student類,其中包含一些字段,用於獲取和設置屬性的方法,用於保存學生的基本信息。然後創建該類的一個實例並嘗試這些方法。 但我每次運行這個程序出現以下錯誤:

TypeError: set_name() takes exactly 1 positional argument (2 given) 

這裏是我寫的代碼。

class Student: 
    '''Student class''' 

    name = None 
    id = 0 
    address = None 
    cgpa = None 

    def get_name(): 
     return name 

    def set_name(n): 
     name = n 

    def get_id(): 
     return id 

    def set_id(i): 
     id = i 

    def get_address(): 
     return address 

    def set_address(a): 
     address = a 

    def get_cgpa(): 
     return cgpa 

    def set_cgpa(c): 
     cgpa = c 


#An object of Student class 
jack = Student() 

jack.set_name('jacky') 
print(jack.get_name()) 

回答

6

你不接受作爲第一個參數傳遞給方法的實例的引用,即你的set_name()應該寫成:

def set_name(self, n): 
    self.name = n 

這是從其他語言有所不同的地方有一個內置關鍵字(如this)引用當前對象。 Python明確地傳遞該引用,作爲方法的參數。

所有其他方法都必須進行類似的修改。

請注意,只是設置name = n會設置一個局部變量name,該方法結束時會消失;它不會在實例上設置任何內容。如果您需要實例屬性,則必須明確設置self.name

另外,這是一個風格問題,但您通常不會在Python中編寫setget方法。直接設置和獲取屬性是正常的做法。如果您想要對值進行驗證,請改爲使用屬性。所以基本上,你的方法都不是很好的風格。

但是,您沒有__init__()方法。通常,在實例化類時將傳遞實例的所需屬性,並將這些屬性保存在實例上。

class Student: 

    def __init__(self, name, id, address, cgpa): 
     self.name = name 
     self.id  = id 
     self.address = address 
     self.cgpa = cgpa 

herman = Student("Herman Munster", 12345, "1313 Mockingbird Lane", 4.0) 
+0

非常感謝你!我是Python的新手,我不知道'self':/ – Ratul 2012-03-02 19:32:20

1

這是因爲方法的第一個參數是self - 類實例。

What is the purpose of self?http://docs.python.org/tutorial/classes.html#class-objects

+0

謝謝:)因爲我是Python的初學者,所以我不知道它。 – Ratul 2012-03-02 19:35:22

+0

@mnzrr,是的,這很不尋常,但是當你更多地使用Python時,它會很方便。請參閱:http://stackoverflow.com/questions/2709821/python-self-explained – warvariuc 2012-03-02 19:36:34

+0

再次感謝warwaruk!我正在關注幾本書,包括Python的一個字節,但沒有看到任何關於'self'的信息:)我必須仔細閱讀> :( – Ratul 2012-03-02 19:51:40

1

在Python中,你需要在self通過爲您的每個成員函數。如果您希望它們發揮作用,您還需要引用類變量self.x

以下是一些您需要應用於其餘代碼的示例。

def set_name(self, n): 
     self.name = n 

    def get_cgpa(self): 
     return self.cgpa 

有一些解釋爲什麼這是這種情況in the documentation

+0

感謝您的快速回答! – Ratul 2012-03-02 19:33:10

2

試試這個:

import sys 
class Student: 
    '''Student class''' 

    self.name = None 
    self.id = 0 
    self.address = None 
    self.cgpa = None 

    def get_name(self): 
     return self.name 

    def set_name(self, n): 
     self.name = n 

    def get_id(self): 
     return self.id 

    def set_id(self, i): 
     self.id = i 

    def get_address(self): 
     return self.address 

    def set_address(self, a): 
     self.address = a 

    def get_cgpa(self): 
     return self.cgpa 

    def set_cgpa(self, c): 
     self.cgpa = c 
+0

謝謝!你不需要重寫:) – Ratul 2012-03-02 19:34:44

2

您需要通過self作爲第一個參數類的每個成員函數。然後必須用成員變量self來提及,即self.name。此外,您可能希望包含一個__init__()函數;這通常用於初始化任何成員變量,並在類的實例化時調用。

看看Python文檔這裏的一些例子上形成良好班:http://docs.python.org/tutorial/classes.html#random-remarks

+0

謝謝Aphnex! :) – Ratul 2012-03-02 19:59:14