2012-03-02 75 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