gpt4 book ai didi

python - 如何通过继承有效地使用鸭子类型(duck typing)

转载 作者:行者123 更新时间:2023-11-30 23:34:15 26 4
gpt4 key购买 nike

我正在使用带有继承的面向对象方法来解决问题,并且我想知道如何将“鸭子类型(duck typing)”原则应用于此问题。

我有一个类 BoxOfShapes ,它将使用 Shapes 列表(CircleSquare矩形)

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__() 方法。据我了解,鸭子类型(duck typing)的实现类似于,

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'];

这更容易阅读,但我不再使用鸭子类型(duck typing),现在每当我想出一种新的形状时,我都必须更改 BoxOfShapes 的定义。

我的问题是(如何)在这种情况下应用鸭子类型(duck typing)?

最佳答案

这实际上并不是关于鸭子类型(duck typing),而是关于一般的继承(例如,您可以对 Java 提出完全相同的问题,因为 Java 没有鸭子类型(duck typing)的概念)。

您想要做的只是创建一个将类型映射到实例列表的字典。动态地做到这一点相当容易:

from collections import defaultdict
type_dict = defaultdict(list)
for element in self.elements:
type_dict[element.type()].append(element.dimStr())
return ','.join('%s: %s' for k, v in type_dict.items())

关于python - 如何通过继承有效地使用鸭子类型(duck typing),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18282343/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com