2017-08-05 16 views
0

私は継承をよりよく理解しようとしています。次のコードでは、friend.salaryを印刷しようとすると、AttributeErrorがスローされます。 WorkingStudentStudentクラスのすべてのメソッドを継承しませんか?継承の理解

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

答えを出す前にコードをテストしてください。実行されていなくても、 'super'への誤った呼び出しは修正されません。しかし、とにかくMotilalは 'WorkingStudent 'ではなく' Student'として作成され、 'salary'属性を持たないため、Annaのクラスを変更しても違いはありません。 –

+0

それは実行されますが、働く学生の友人は働く学生でなければならず、働かない生徒の友人は非生徒です。この方法で新しい生徒を作ることは悪い考えです。質問に対する私のコメントを見てください。 –

+0

実際、私は、@ハリー・ラオ・バラジがPython継承を理解するのを助ける解決策を提案しました。そして、私はあなたが思うように、本当に悪い考えではない方法で新しい学生を作り出すことができると確信できます。それはそれぞれの状況によって異なります。私は、Harish Rao Balajiが生徒を作りたいと思って、その生徒のすべての友達を作りたいと思っています。ここでの目的は新しい生徒を作るのではなく、その生徒の新しい友達を作ることです。私はあなたが新しい生徒を作ることができることを知っています。そして、あなたは両方の生徒を友達にする別の機能を定義します。しかし、それはHarish Rao Balajiに依存しています。 – Toandd