我正在使用繼承的面向對象方法來解決問題,我想知道如何將「鴨打字」原則應用於此問題。如何有效地繼承使用鴨打字
我有一個類BoxOfShapes
這將與Shapes
(Circle
,Square
和Rectangle
)名單中實例化
import numpy as np
class Shape(object):
def __init__(self,area):
self.area = area;
def dimStr(self):
return 'area: %s' % str(self.area)
def __repr__(self):
return '%s, %s' % (self.__class__.__name__, self.dimStr()) + ';'
class Circle(Shape):
def __init__(self,radius):
self.radius = radius
def dimStr(self):
return 'radius %s' % str(self.radius)
class Rectangle(Shape):
def __init__(self, width, height):
self.width = width
self.height = height
def dimStr(self):
return '%s x %s' % (str(self.width), str(self.height))
class Square(Rectangle):
def __init__(self, side):
self.width = side
self.height = side
class BoxOfShapes(object):
def __init__(self, elements):
self.elements = elements
def __repr__(self):
pass
listOfShapes = [Rectangle(10,13),Rectangle(9,5),Circle(12),Circle(8),Circle(36),Square(10)]
myBox = BoxOfShapes(listOfShapes)
print myBox
所以讓我們看看BoxOfShapes
的__repr__()
方法。據我瞭解,鴨打字的實施會是這樣的,
def __repr__(self):
return str(self.elements)
因爲這樣說:「我不在乎我有什麼樣的元素,只要它們實現__str__()
或__repr__()
。這個輸出是
>>> print myBox
[Rectangle, 10 x 13;, Rectangle, 9 x 5;, Circle, radius 12;, Circle, radius 8;, Circle, radius 36;, Square, 10 x 10;]
可以說,我想從BoxOfShapes
更可讀的輸出 - 我知道所有的形狀是某些類型的,所以這將是很好的分類,他們就像這樣:
def __repr__(self):
circles = [ el.dimStr() for el in self.elements if isinstance(el, Circle)]
squares = [ el.dimStr() for el in self.elements if isinstance(el, Square)]
rectangles = [el.dimStr() for el in self.elements if (isinstance(el, Rectangle) and not isinstance(el, Square)) ]
return 'Box of Shapes; Circles: %s, Squares: %s, Rectangles: %s;' % (str(circles), str(squares), str(rectangles))
這樣做的輸出,
>>> print myBox
Box of Shapes; Circles: ['radius 12', 'radius 8', 'radius 36'], Squares: ['10 x 10'], Rectangles: ['10 x 13', '9 x 5'];
哪一個更容易閱讀,但我不再使用鴨打字,現在我不得不改變我的BoxOfShapes
定義每當我想到一種新的形狀。
我的問題是(如何)將這種情況下應用鴨子打字?
'__repr__'應該是不太模糊,你正在使用。特別是,它應該使用元素「__repr__」,它應該可能顯示元素的順序。要嘗試的一件好事是製作'eval(repr(thing))== thing',或者儘可能地接近你的想法。我推薦'返回'BoxOfShapes({})'。格式(repr(self.elements))' – user2357112
如果你想要一些漂亮而且容易理解的東西,那就是'__str__'的用途。 – user2357112
與那些'type()'靜態方法有什麼關係?你應該可能會失去它們。如果你需要一個對象類型的名字,那麼就有內建的'type()'函數和類型的__name__'屬性(並且通常不用,你可以使用類型對象而不是用名字來混淆) )。 – delnan