Python总结-(getattr, map)

现有正方形,三角形和圆这三个类,他们求面积的方法名分别为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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值