2017-05-02 15 views
0

私はこれを理解するのが難しいです。私はコースと呼ばれる2つのクラスとトランスクリプトと呼ばれる2つのクラスを作成しました。他のクラスの属性がリストに追加されて印刷されない

私は、 "add_course"と呼ばれるTranscriptクラスのメソッドを持っています。それは、 "self.courses"として設定された "courses"というコースリストにそれに与えられたコースを追加することになっています。

問題は、いくつかのテストコースを追加した後にTranscriptクラスを印刷すると、何も追加されずに「Transcript:」だけが印刷されることです。

class Course: 
    def __init__(self, number, credit, grade): 
     #validgrades = ['A','B','C','D','F','IP'] 
     #if grade not in validgrades: 
      #raise CourseError("bad grade" + "'" + grade + "'") 
     self.number = number #string 
     self.credit = credit #int 
     self.grade = grade #string 
    def __str__(self): 
     return ('%s: credit %d, grade %s' % (self.number, self.credit, self.grade)) 
    def __eq__(self,other): 
     return self.number==other.number and self.credit==other.credit and self.grade==other.grade 
    def is_passing(self): 

     if self.grade == 'F' or self.grade == 'IP': 
      return False 
     else: 
      return True 
c1 = Course("CS112",4,"A") 
print(c1) 
print(c1.is_passing()) 
c2 = Course("ENGH101", 3, "B") 
print(c1==c2) 
c3 = Course("MATH113", 4, "IP") 

class Transcript: 

    def __init__(self): 
     courses = [] 
     self.courses = courses 


    def __str__(self): 
     strtrans="" 
     strtrans +='Transcript:\n' 
     for i in self.courses: 
      strtrans+= '%s\n\t' %(i) 
     return strtrans 

    def __eq__(self,other): 
     if self.courses == other.courses: 
      return True 
     else: 
      return False 
    def add_course(self,course): 
     for i in self.courses: 
      self.courses.append(course) 

    def course_by_number(self, number): 
     for i.number in self.courses: 
      if self.number == number: 
       print('It worked!') 
       return True 
      elif self.number == None: 
       return None 
      else: 
       return False 
t=Transcript() 
print(t) 
t.add_course(c1) 
t.add_course(c2) 
t.add_course(c3) 
print(t) 

出力は次のようになります。

CS112:クレジット4、グレード

トランスクリプト:

トランスクリプト:

、それは次のようになります。

トランスクリプト:

CS112:クレジット4、グレード

ENGH101:クレジット3、グレードB

MATH113:クレジット4、等級IP

+0

あなたの問題はおそらくここにあります。 'self.course = self.courses.append(course)'あなたは 'self.course =' appendを必要とせず、リストを変更します。それは追加せずに返します – Nullman

+0

私はその部分を削除し、それでも何も印刷しません。 – ruckarucka

答えて

1

あなたの問題はそれです

def add_course(self,course): 
    for i in self.courses: 
     self.course = self.courses.append(course) 

self.coursesを反復しています。このリストが空の場合、forループは反復するものがないため実行されません。これは実際には、繰り返している同じリストに追加するときに無限ループ(MemoryErrorを実行するまで)を引き起こします。

@Nullmanはコメントで説明したように、最初にあなたを呼び出すリストの後list.append戻りますので

self.courses = self.courses.append(course) 

Noneは今Noneであるadd_courseが呼び出された二回目であるあなたが見ることがもう一つの問題は、それは、だからあなたの関数がちょうど

def add_course(self,course): 
    self.courses.append(course) 
でなければなりません

AttributeError: 'NoneType' object has no attribute 'append' 

を引き上げます

+0

OK、それは意味があります。したがって、.appendはインプレース修正を使用するので、同じリストを何度も繰り返す必要はありません。単純に.appendを使用できますか? – ruckarucka

+0

はい、appendは、指定されたオブジェクトをリストの最後に追加します。 –

関連する問題