回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我使用面向对象的继承方法来解决一个问题,我想知道如何将“Duck-Typing”原则应用到这个问题上。在</p>
<p>我有一个类<code>BoxOfShapes</code>,它将用<code>Shapes</code>(<code>Circle</code>,<code>Square</code>和{<cd5>})的列表实例化</p>
<pre><code>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
</code></pre>
<p>让我们看看<code>__repr__()</code>的<code>__repr__()</code>方法。据我所知,duck类型的实现应该类似于</p>
^{pr2}$
<p>因为这意味着“我不在乎我有什么元素,只要它们实现<code>__str__()</code>或{<cd6>}。结果是</p>
<pre><code>>>> print myBox
[Rectangle, 10 x 13;, Rectangle, 9 x 5;, Circle, radius 12;, Circle, radius 8;, Circle, radius 36;, Square, 10 x 10;]
</code></pre>
<p>假设我想从<code>BoxOfShapes</code>得到一个更具可读性的输出-我知道所有形状都是特定类型的,因此最好对它们进行分类,如下所示:</p>
<pre><code> 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))
</code></pre>
<p>结果是</p>
<pre><code>>>> print myBox
Box of Shapes; Circles: ['radius 12', 'radius 8', 'radius 36'], Squares: ['10 x 10'], Rectangles: ['10 x 13', '9 x 5'];
</code></pre>
<p>它更容易阅读,但我不再使用duck类型,现在我必须随时更改<code>BoxOfShapes</code>的定义,只要我想出一种新的形状。在</p>
<p>我的问题是(如何)在这种情况下应用duck类型?在</p>