现有正方形,三角形和圆这三个类,他们求面积的方法名分别为get_area1(),get_area2(),get_area3()
如果我们创建了多个对象,需要求多次面积,那么这无疑是很麻烦的,因为三个类求面积的方法名都不一样
怎样解决呢?话不多说,先给出三个类
# 三个类
class Rectangle:
def __init__(self, a, b):
self.a, self.b = a, b
def get_area1(self):
return self.a * self.b
class Triangle:
def __init__(self, a, b, c):
self.a, self.b, self.c = a, b, c
def get_area2(self):
a, b, c = self.a, self.b, self.c
p = (a + b + c) / 2
return (p * (p - a) * (p - b) * (p - c)) ** 0.5
class Circle:
def __init__(self, r):
self.r = r
def get_area3(self):
return self.r ** 2 * 3.14159
需要实现的,就是使用一个名字get_area()调用三个名字不同的方法get_area1(), get_area2(), get_area3()
这里就要先了解getattr()了
getattr() 函数用于返回一个对象属性值
getattr(a, b) 表示返回a对象的b属性值
getattr(a, b, c) 假设不提供第三个参数c(默认返回值)
如果a对象没有b属性,那么就会触发AttributeError
使c = None可以避免该报错
上代码
shape1 = Triangle(3, 4, 5)
shape2 = Rectangle(4, 9)
shape3 = Circle(2)
def get_area(shape):
area_method = ['get_area1', 'get_area2', 'get_area3']
for name in area_method:
f = getattr(shape, name, None)
if f:
return f()
# 使用一个方法实现三个类的求面积操作
print(get_area(shape1))
print(get_area(shape2))
print(get_area(shape3))
掌握map()就可以更简洁,不需要 print 三次
map() 根据提供的函数对指定序列做映射
map(function, iterable, ...) function--函数,iterable--一个或多个序列
map()返回值 python2返回列表,python3返回迭代器
因为在python3中map()返回迭代器,所以要用 list() 稍微转换一下
>>> def demo(x):
return x ** 2
>>> map(demo, [1, 2, 3])
<map object at 0x000001FB2394BEB0> # 迭代器地址
>>> list(map(demo, [1, 2, 3])) # 用list转换成列表输出
[1, 4, 9]
上代码
shape1 = Triangle(3, 4, 5)
shape2 = Rectangle(4, 9)
shape3 = Circle(2)
shape_list = [shape1, shape2, shape3]
area_list = list(map(get_area, shape_list))
print(area_list)