python:修改子方法中父方法的数组

python:修改子方法中父方法的数组,python,arrays,class,methods,Python,Arrays,Class,Methods,我有一个父类,如下所示: class student: def __init__(self, name, age, field): self.name = name self.age = age self.field = field def abilities(self): abs = ["study", "drink", "party&qu

我有一个父类,如下所示:

class student:
    def __init__(self, name, age, field):
            self.name = name
            self.age = age
            self.field = field

    def abilities(self):
        abs = ["study", "drink", "party"]
        action = np.random.choice(abs, replace = True)
        return(action)

现在,毕业后,这个学生长大了,他的能力也发生了变化:


class adult(student):
    def abilities(self):
        super().abilities()
        abs.append("work")
        abs.remove("party")
        if action == work:
            print("paying off that student loan")

这是行不通的。我得到的错误是:
未定义名称“abs”

现在,我试图通过使用
super().abilities.abs
访问父类中的
abilities
方法,但随后我引用了函数返回的对象和
self.abilities.abs
,但随后我引用了该类


非常感谢您就如何从子方法访问父方法中的数组提出的任何建议。

您编写的代码中有一些缺陷:

  • 您正在覆盖代码中的内置函数
    abs
    。不应该这样做
  • 您正在调用
    super().abilities()
    ,它返回一个值而不存储和使用它
  • 调用
    abs.append(“work”)
    时,您试图为内置函数赋值,而不是从父函数中为局部变量
    abs
    。将其提取到对象变量可以解决这个问题。请参见构造函数中的,
    self.abs
  • 成人
    能力
    方法不返回任何内容
  • 您没有在成人中调用超级构造函数,这导致成人没有存储在构造函数中传递的任何值
  • 固定版本可以如下所示:

    class student:
        def __init__(self, name, age, field):
                self.name = name
                self.age = age
                self.field = field
    
        def abilities(self):
            abs = ["study", "drink", "party"]
            action = np.random.choice(abs, replace = True)
            return(action)
    
    
    将numpy导入为np
    班级学生:
    定义初始(自我、姓名、年龄、字段):
    self.name=名称
    self.age=年龄
    self.field=字段
    self.abs=[“学习”、“喝酒”、“聚会”]
    def能力(自我):
    action=np.random.choice(self.abs,replace=True)
    返回动作
    班级成人(学生):
    定义初始(自我、姓名、年龄、字段):
    超级(成人,自我)。\uuuu初始(姓名、年龄、字段)
    self.abs.append(“工作”)
    自身abs.移除(“一方”)
    def能力(自我):
    action=super().能力()
    如果操作==“工作”:
    打印(“偿还学生贷款”)
    返回动作
    

    除了解决这个问题,您还应该查看@chepner评论中提到的对象继承结构。

    成年人不是学生。继承在这里不合适。您可以创建
    成人
    的实例,但前提是
    学生
    的实例,或者创建一个
    Person
    类,其实例可以处于“学生”状态或“成人”状态(尽管我建议不要这样做)。在
    abs
    的所有实例中使用
    self.abs
    ,非常感谢您在@mpSchrader上的详细评论。是否您的一些评论提到了Python2.x和3.x之间的差异?无论如何,我对定义只有一个疑问
    action=super().abilities()
    。如果选择了工作以外的其他操作,则会返回短语“偿还学生贷款”。不过,我无法确定确切的问题是什么。不客气。我用Python3测试它,但它也应该用Python2。当前,它将打印
    偿还该学生贷款
    并返回当前操作值。如果您想返回
    偿还该学生贷款
    如果操作是
    工作
    ,则可以将打印行替换为
    返回“偿还该学生贷款”
    检查!我尝试将操作定义为print语句,但忘记在同一个条件语句中返回它。非常感谢分享您的见解!当然我很高兴它帮助并回答了你所有的问题。抱歉,我以为我已经接受了。相反,我只是投了更高的票。