2017-08-05 83 views
0

我试图更好地理解继承。在下面的代码中,当我尝试打印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 
+3

您的缩进是否正确?那'anna = WorkingStudent(...)'线真的应该在'__init__'里面吗? – BrenBarn

+0

是的,它的缩进效果很好。我认为这是正确的缩进。 – learner

+0

[Python派生类和基类属性?]的可能重复?(https://stackoverflow.com/questions/6396452/python-derived-class-and-base-class-attributes) –

回答

0

你应该修改源代码如下

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) 

Editted。所以代码现在可以工作

+0

请在回答之前测试您的代码,它甚至不会运行 - 它不会纠正对“超级”的错误调用。但无论如何,改变安娜的班级并没有什么区别,因为Motilal仍然会被创建为“学生”,而不是“工作学生”,因此不会有“薪水”属性。 –

+0

它运行起来,但对于在职学生的朋友应该是在职学生,并且对非在职学生的朋友是非在职学生是没有意义的。以这种方式创建新学生是个坏主意,请参阅我对这个问题的评论。 –

+0

其实,我提出了一个解决方案,帮助@Harish Rao Balaji了解Python的继承。我可以肯定的是,按照你的想法,以这种方式创建新的学生并不是一个好主意。这取决于每种情况。我明白,Harish Rao Balaji想创建一个学生,然后创建该学生的所有朋友,这里的目的不是创造新学生,而是创造该学生的新朋友。我知道你可以创建新的学生,然后你定义另一个功能,使两个学生成为朋友。但是,这取决于Harish Rao Balaji的工作。 – Toandd