2011-08-15 5 views
4

私はCS-600のMITオープンコースウェアに取り組んでいます。最後の印刷文が何も印刷していない理由を理解できません。メインメソッドの一番下にあるprint文が何も印刷しないのはなぜですか?

#!/usr/bin/env python 
# encoding: utf-8 
# 6.00 Problem Set 9 
# 
# Name: 
# Collaborators: 
# Time: 

from string import * 

class Shape(object): 
    def area(self): 
     raise AttributeException("Subclasses should override this method.") 

class Square(Shape): 
    def __init__(self, h): 
     """ 
     h: length of side of the square 
     """ 
     self.side = float(h) 
    def area(self): 
     """ 
     Returns area of the square 
     """ 
     return self.side**2 
    def __str__(self): 
     return 'Square with side ' + str(self.side) 
    def __eq__(self, other): 
     """ 
     Two squares are equal if they have the same dimension. 
     other: object to check for equality 
     """ 
     return type(other) == Square and self.side == other.side 

class Circle(Shape): 
    def __init__(self, radius): 
     """ 
     radius: radius of the circle 
     """ 
     self.radius = float(radius) 
    def area(self): 
     """ 
     Returns approximate area of the circle 
     """ 
     return 3.14159*(self.radius**2) 
    def __str__(self): 
     return 'Circle with radius ' + str(self.radius) 
    def __eq__(self, other): 
     """ 
     Two circles are equal if they have the same radius. 
     other: object to check for equality 
     """ 
     return type(other) == Circle and self.radius == other.radius 

# 
# Problem 1: Create the Triangle class 
# 
## TO DO: Implement the `Triangle` class, which also extends `Shape`. 

class Triangle(Shape): 
    def __init__(self, base, height): 
     self.base = float(base) 
     self.height = float(height) 
    def area(self): 
     return self.base*self.height/2 
    def __str__(self): 
     return 'Triangle with base ' + str(self.base) + 'and height ' + str(self.height) 
    def __eq__(self, other): 
     return type(other) == Triangle and self.base == other.base and self.height == other.height 
# 
# Problem 2: Create the ShapeSet class 
# 
## TO DO: Fill in the following code skeleton according to the 
## specifications. 

class ShapeSet(object): 
    def __init__(self): 
     """ 
     Initialize any needed variables 
     """ 
     self.allCircles = [] 
     self.allSquares = [] 
     self.allTriangles = [] 
     self.allShapes = self.allCircles + self.allSquares + self.allTriangles 
     self.place = None 
    def addShape(self, sh): 
     """ 
     Add shape sh to the set; no two shapes in the set may be 
     identical 
     sh: shape to be added 
     """ 
     if not isinstance(sh, Shape): raise TypeError('not a shape') 
     if isinstance(sh, Square): 
      for sq in self.allSquares: 
       if sh == sq: 
        raise ValueError('shape already in the set') 
      self.allSquares.append(sh) 
     if isinstance(sh, Triangle): 
      for tri in self.allTriangles: 
       if sh == tri: 
        raise ValueError('shape already in the set') 
      self.allTriangles.append(sh) 
     if isinstance(sh, Circle): 
      for circ in self.allCircles: 
       if sh == circ: 
        raise ValueError('shape already in the set') 
      self.allCircles.append(sh) 
    def __iter__(self): 
     """ 
     Return an iterator that allows you to iterate over the set of 
     shapes, one shape at a time 
     """ 
     self.place = 0 
     return self 
    def next(self): 
     if self.place >= len(self.allShapes): 
      raise StopIteration 
     self.place += 1 
     return self.allShapes[self.place - 1] 

    def __str__(self): 
     """ 
     Return the string representation for a set, which consists of 
     the string representation of each shape, categorized by type 
     (circles, then squares, then triangles) 
     """ 
     shapeList = "" 
     for item in self.allShapes: 
      shapeList += item.get__str__ + "br/" 
     return shapeList 

# 
# Problem 3: Find the largest shapes in a ShapeSet 
# 
def findLargest(shapes): 
    """ 
    Returns a tuple containing the elements of ShapeSet with the 
     largest area. 
    shapes: ShapeSet 
    """ 
    ## TO DO 

# 
# Problem 4: Read shapes from a file into a ShapeSet 
# 
def readShapesFromFile(filename): 
    """ 
    Retrieves shape information from the given file. 
    Creates and returns a ShapeSet with the shapes found. 
    filename: string 
    """ 
    ## TO DO 

def main(): 
    sq1 = Square(4.0) 
    sq2 = Square(5.0) 
    sq3 = Square(3.0) 
    circ1 = Circle(3.0) 
    circ2 = Circle(3.2) 
    tri1 = Triangle(3.0, 4.0) 
    tri2 = Triangle(4.0, 3.0) 
    tri3 = Triangle(1.0, 1.0) 
    thisSet = ShapeSet() 
    thisSet.addShape(sq1) 
    thisSet.addShape(sq2) 
    thisSet.addShape(sq3) 
    thisSet.addShape(circ1) 
    thisSet.addShape(circ2) 
    thisSet.addShape(tri1) 
    thisSet.addShape(tri2) 
    thisSet.addShape(tri3) 
    print thisSet 



if __name__ == '__main__': 
    main() 

答えて

1

この行はallShapesに空のリストを作る:あなたはallCirclesを変更した場合、allShapesに影響を与えない

self.allShapes = self.allCircles + self.allSquares + self.allTriangles 

。私は個人的にallShapesを排除し、STR方法では、第2の最後の可能性でそれらを追加します。

for item in self.allCircles + self.allSquares + self.allTriangles: 
6

この行を::

self.allShapes = self.allCircles + self.allSquares + self.allTriangles 

は、あなたはそれがないと思う何をしませんここで私が書いたコードです。 allShapesを空のリストに設定し、後で図形を追加すると何も更新されませんallShapes

__str__関数はallShapesをループしますが、まだ空ですので、__str__は空の文字列を返します。

0

これはあなたの実際のコードであれば、それはので、例外を発生させなければならない

item.get__str__ 

でなければなりません。

編集::これは実際の問題ではありませんが、ここではさらなる進歩のヒントとして残しておきます。あなたが気にしているように、恐らくx.__str__()と直接電話するのは悪いスタイル(「不快」)と考えられます。代わりに__str__の実装でstr(x)を呼び出してください。

0

あなたはself.allCircles + self.allSquares + self.allTrianglesのするallShapesを割り当てますinitメソッドのstart(他のリストが空の場合)。

値は変更されないため、空のままです。

あなたはaddShapeでこれを必要とする:

self.allShapes.append(sh) 
1

問題はここにある:

self.allShapes = self.allCircles + self.allSquares + self.allTriangles 

あなたはこのようなリストを連結すると、結果は部品リストのコピーです。したがって、これらのリストが後で変更された場合、連結リストは変更されません。この場合、self.allCirclesなどはすべて空です。したがって、self.allShapesも空のリストです。 ShapeSet.__str__のforループはShapeListに何も追加しないので、結果は空の文字列になります。この問題を解決するために

一つの簡単な方法は、あなたが呼び出すallShapes方法を作ることであろう、そしてそれはself.allCircles ...などの新しい連結にそれが呼ばれるたびに返されます。そうすれば、allShapesは常に最新の状態になります。

関連する問題