Python 3.x中的TypeError

Rat*_*tul 2 python typeerror python-3.x

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

这是CSE 111 - Programming Language II课程中的实验室问题.他们在大学教Java,我用Java编写的代码工作得很好.

我只需要创建一个带有一些字段的Student类来保存学生的基本信息,并获取获取和设置属性的方法.然后创建该类的实例并尝试使用这些方法.但每次运行此程序时都会发生以下错误:

TypeError: set_name() takes exactly 1 positional argument (2 given)
Run Code Online (Sandbox Code Playgroud)

这是我写的代码.

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())
Run Code Online (Sandbox Code Playgroud)

kin*_*all 6

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

def set_name(self, n):
    self.name = n
Run Code Online (Sandbox Code Playgroud)

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

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

请注意,只是设置name = n设置一个局部变量name,该变量在方法结束时消失; 它没有在实例上设置任何内容.您必须显式设置self.name是否需要实例属性.

此外,这是一个风格问题,但你通常不会在Python中编写set和使用get方法.通常的做法是直接设置和获取属性.如果要对值进行验证,请改用属性.所以基本上,你的方法都不是真正必要的.

但是,您没有__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)
Run Code Online (Sandbox Code Playgroud)