[英]Why does the print statement at the bottom of my main method not print anything?
我正在為 CS-600 編寫 MIT 開放課件,但我無法弄清楚為什么最后一個打印語句沒有打印任何內容。 這是我寫的代碼:
#!/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()
這一行:
self.allShapes = self.allCircles + self.allSquares + self.allTriangles
不做你認為它做的事。 它將allShapes
設置為一個空列表,然后當您稍后添加形狀時,不會更新allShapes
。
然后你的__str__
function 只是循環allShapes
,它仍然是空的,所以你的__str__
返回一個空字符串。
此行使 allShapes 成為一個空列表:
self.allShapes = self.allCircles + self.allSquares + self.allTriangles
如果您修改 allCircles,則不會影響 allShapes。 我會親自消除 allShapes,並在str方法中,在可能的最后一秒添加它們:
for item in self.allCircles + self.allSquares + self.allTriangles:
問題在這里:
self.allShapes = self.allCircles + self.allSquares + self.allTriangles
當您像這樣連接列表時,結果是組件列表的副本。 因此,當這些列表稍后更改時,串聯列表不會更改。 在這種情況下, self.allCircles
等都是空的。 所以self.allShapes
也是一個空列表; ShapeSet.__str__
中的 for 循環對 ShapeList 沒有ShapeList
任何內容,因此結果是一個空字符串。
解決此問題的一種簡單方法是使allShapes
成為您調用的方法,並在每次調用時返回self.allCircles
... 等的新串聯。 這樣, allShapes
始終是最新的。
如果這是您的實際代碼,那么一定是因為
item.get__str__
這應該引發異常。
編輯:正如其他人所指出的,這不是實際問題,但我將其留在這里作為進一步進展的提示。 請注意,正如您可能想要的那樣,直接調用x.__str__()
被認為是不好的風格(“unpythonic”)。 改為調用str(x)
,即使在__str__
的實現中也是如此。
您在 init 方法的開頭將 allShapes 指定為 self.allCircles + self.allSquares + self.allTriangles 的值(當其他列表為空時)。
然后它的值永遠不會改變,所以它仍然是空的。
你在 addShape 中需要這個:
self.allShapes.append(sh)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.