Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python3.x中的TypeError_Python_Python 3.x_Typeerror - Fatal编程技术网

Python3.x中的TypeError

Python3.x中的TypeError,python,python-3.x,typeerror,Python,Python 3.x,Typeerror,我不知道怎么了!这是一个非常简单的程序,我已经做了很多的头部撞击!请有人开导我 这是CSE111-编程语言II课程中的一道实验题。他们在大学里教Java,我用Java编写的代码工作得很好 我只需要创建一个包含一些字段的Student类来保存有关Student的基本信息,并使用方法来获取和设置属性。然后创建该类的实例并试用这些方法。 但每次运行此程序时,都会出现以下错误: TypeError: set_name() takes exactly 1 positional argument (2 gi

我不知道怎么了!这是一个非常简单的程序,我已经做了很多的头部撞击!请有人开导我

这是CSE111-编程语言II课程中的一道实验题。他们在大学里教Java,我用Java编写的代码工作得很好

我只需要创建一个包含一些字段的Student类来保存有关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\u name()
应写入:

def set_name(self, n):
    self.name = n
这与其他语言有所不同,其他语言中有一个指向当前对象的内置关键字(如
This
)。Python将该引用作为参数显式传递给该方法

所有其他方法都必须进行类似的修改

注意,只要设置
name=n
就可以设置一个局部变量
name
,该变量在方法结束时消失;它不会在实例上设置任何内容。如果需要实例属性,则必须显式设置
self.name

另外,这是一个风格问题,但是您通常不会用Python编写
set
get
方法。通常的做法是直接设置和获取属性。如果要验证值,请改用属性。所以基本上,你的方法没有一个是真正需要的好风格

但是,您没有
\uuuu init\uuuu()
方法。通常,在实例化类时,您会传递实例所需的属性,并将这些属性保存在实例上

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)

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

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)

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

下面是几个示例,您需要将它们应用于代码的其余部分

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

   def get_cgpa(self):
       return self.cgpa
这种情况的原因有一些解释。

试试这个:

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
。此外,您可能希望包括一个
\uuuu init\uuu()
函数;这通常用于初始化任何成员变量,并在类的实例化时调用


请看一下Python文档,了解一些关于格式良好的类的示例:

非常感谢!我是Python新手,对
self
:谢谢你的快速回答!谢谢不过您不必重写:)谢谢:)我不知道,因为我是Python的初学者。@mnzrr,是的,这很不寻常,但当您更多地使用Python时,它会很方便。再次感谢沃鲁克!我看了几本书,包括《Python的一个字节》,但没有看到任何关于
self
:)我必须更仔细地阅读>:(是的:)我接受了kindall的答案,因为它更具描述性:)