【问题标题】:Understanding Inheritance了解继承
【发布时间】:2017-08-05 03:12:45
【问题描述】:

我试图更好地理解继承。在下面的代码中,当我尝试打印friend.salary 时,它会抛出一个AttributeErrorWorkingStudent不是继承了Student类的所有方法吗?

class Student:
    def __init__(self,name,school):
        self.name = name
        self.school = school
        self.marks = []

    def average(self):
        return sum(self.marks)/len(self.marks)

    def friend(self,friend_name):
        return Student(friend_name, self.school)

anna = Student("Anna","MIT")
friend = anna.friend("Motilal")
#print (friend.name)
#print (friend.school)

class WorkingStudent(Student):
    def __init__(self,name,school,salary):
        super().__init__(self,name,school)
        self.salary = salary
        anna = WorkingStudent("Anna","SXS",25000)
anna.friend("Greg")
anna.marks.append(50)
print friend.salary 

【问题讨论】:

  • 你的缩进是否正确?那条anna = WorkingStudent(...) 真的应该在__init__ 里面吗?
  • 是的,这个缩进效果很好。我认为这是正确的缩进。
  • 不要以其他学生的方法创建学生,那不是他们的工作。直接调用motilal = Student("Greg", anna.school)greg = WorkingStudent("Greg", anna.school)创建学生。
  • 我将您的问题陈述移到您的代码块之前。使用一些上下文来消化代码通常更容易。详情请见How to Ask

标签: python inheritance


【解决方案1】:

你应该修改你的源代码如下

class Student:
    def __init__(self,name,school):
        self.name = name
        self.school = school
        self.marks = []

    def average(self):
        return sum(self.marks)/len(self.marks)

    def friend(self,friend_name):
        return Student(friend_name, self.school)


anna = Student("Anna","MIT")
friend = anna.friend("Motilal")
#print (friend.name)
#print (friend.school)


class WorkingStudent(Student):
    def __init__(self,name,school,salary):
        super(WorkingStudent,self).__init__(name,school)
        self.salary = salary
        # anna = WorkingStudent("Anna","SXS",25000)
    def friend(self,friend_name):
        return WorkingStudent(friend_name, self.school, self.salary)

# You should put your code here, because as your original code
# anna is an instance of Student not WorkingStudent class
# so it and its friend don't have "salary".
anna = WorkingStudent("Anna","SXS",25000) # After this line, anna is a different variable to "anna" variable that was defined before (anna = Student("Anna","MIT"))
friend = anna.friend("Greg") # friend now is an instance of WorkingStudent class, so it have salary
anna.marks.append(50)
print(friend.salary)

已编辑。所以代码现在可以工作了

【讨论】:

  • 请在回答之前测试您的代码,它甚至无法运行 - 它无法纠正对 super 的错误调用。但无论如何,更改 Anna 的类不会有任何区别,因为 Motilal 仍将创建为 Student,而不是 WorkingStudent,因此不会有 salary 属性。
  • 它可以运行,但是工作学生的朋友应该是工作学生,非工作学生的朋友应该是非工作学生是没有意义的。以这种方式创建新学生是一个的想法,请参阅我对这个问题的评论。
  • 其实我提出了一个解决方案,可以帮助@Harish Rao Balaji 理解python 的继承。而且我可以肯定,以这种方式创建新学生并不是你想的那样真的是个坏主意。这取决于每种情况。我了解 Harish Rao Balaji 想要创建一个学生,然后创建该学生的所有朋友,这里的目的不是创建新学生,而是创建该学生的新朋友。我知道你可以创建新学生,然后定义另一个函数让两个学生成为朋友。但这取决于 Harish Rao Balaji 来完成这项工作。
  • 感谢 Thierry Lathuille 和 Toandd,感谢您的宝贵时间和反馈。代码正在运行,但我的概念,因此我的应用程序不是很清楚。现在我明白了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-16
相关资源
最近更新 更多