繁体   English   中英

Python 3.x中的TypeError

[英]TypeError in Python 3.x

我不知道出了什么问题! 这是一个非常简单的程序,我做了很多头敲打! 请有人赐教!

这是CSE 111 - Programming Language 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())

您不接受对您的实例的引用作为该方法的第一个参数,即您的set_name()应该被写入:

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

这与其他语言有些不同,在这些语言中有一个引用当前对象的内置关键字(例如this )。 Python将该引用显式传递,作为方法的参数。

必须类似地修改所有其他方法。

请注意,只需设置name = n设置一个局部变量name ,该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)

尝试这个:

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

您需要将self作为第一个参数传递给类的每个成员函数。 然后必须使用self引用成员变量,即self.name 此外,您可能希望包含__init__()函数; 这通常用于初始化任何成员变量,并在类的实例化时调用。

在这里查看Python文档,了解有关格式良好的类的一些示例: http//docs.python.org/tutorial/classes.html#random-remarks

这是因为方法的第一个参数是self - 类实例。

看看自我的目的是什么? http://docs.python.org/tutorial/classes.html#class-objects

在Python中,您需要为每个成员函数传递self 如果希望它们生效,您还需要将类变量引用为self.x

以下是您需要应用于其余代码的几个示例。

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

   def get_cgpa(self):
       return self.cgpa

有一些解释为什么在文档中就是这种情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM