如何正确实现列表作为实例变量?

时间:2017-11-07 20:12:10

标签: python python-3.x

所以,我正在阅读使用Python编程简介并为我自己的启发做练习。我正在学习自定义类并进入它所声明的部分:"程序应该使用一个名为Quizzes的类,它有一个实例变量来保存六个等级的列表......"所以我尝试了以下内容:

class Quizzes:

    def __init__(self, grade1=0):
        self._grade1 = grade1

    def setGrade1(self, grade1):
        self._grade1 = grade1

    def getGrade1(self):
        return self._grade1

    def grades(self):
        return []

    def gradeInsert(self, a=grades()):
        a.append(self._grade1)

在这种情况下,我得到" TypeError:grades()缺少1个必需的位置参数:' self'。

我也尝试过:

   def __init__(self, grade1=0, grades=[]):
       self._grade1 = grade1
       self._grades = grades

   def setGrade1(self):
       self._grade1 = grade1

   def setGrades(self):
       self._grades = [self.getGrade1()]

   def getGrades(self):
       return self._grades

但我得到一个空白[]。我对_ init _中的成绩= []所做的任何修改都反映在我的getGrades调用中。那么我如何让setGrades实际设置?还是我完全不合适?

2 个答案:

答案 0 :(得分:4)

应在__init__

内初始化实例变量
class Quizzes:

    def __init__(self):
        self._grades = [] # Here, we initialize the list

    def grades(self):
        return self._grades # We can return the instance variable here

    def gradeInsert(self, a): # No reason for a default argument here
        self._grades.append(a) # Add the value to the list

答案 1 :(得分:2)

在您的第一个示例中,您尝试调用grades(),它是Quizzes类的成员函数。成员函数期望实例作为第一个参数,在点(the_instance.grades())之前或作为显式参数(不太常见)作为显式参数(grades(the_instance))。你既不提供,也不提供Python抱怨。

在你的第二个例子中,在定义类之后你不清楚你实际做了什么。

一般来说,这两个课程与练习没什么关系,可以通过以下方式解决:

class quizzes(object):
  def __init__(self, grades = None):
    if grades is None:
      self.grades = [0]*6
    else:
      self.grades = grades[:6]

BTW:不建议使用可变对象作为默认参数,因为此对象在所有调用之间共享。