zoukankan      html  css  js  c++  java
  • Python-通过实例方法调用-统一接口的实现-getter methodcaller

    某项目中,我们的代码使用的2个不同库中的图形类:

      Circle,Triangle

    这两个类中都有一个获取面积的方法接口,但是接口的名字不一样

    统一这些接口,不关心具体的接口,只要我调用统一的接口,对应的面积就会计算出来

    如何解决这个问题?

      定义一个统一的接口函数,通过反射:getattr进行接口调用

    #!/usr/bin/python3
    
    from math import pi
    
    
    class Circle(object):
        def __init__(self, radius):
            self.radius = radius
    
        def getArea(self):
            return round(pow(self.radius, 2) * pi, 2)
    
    
    class Rectangle(object):
        def __init__(self, width, height):
            self.width = width
            self.height = height
    
        def get_area(self):
            return self.width * self.height
    
    
    # 定义统一接口
    def func_area(obj):
        # 获取接口的字符串
        for get_func in ['get_area', 'getArea']:
            # 通过反射进行取方法
            func = getattr(obj, get_func, None)
            if func:
                return func()
        
    
    if __name__ == '__main__':
        c1 = Circle(5.0)
        r1 = Rectangle(4.0, 5.0)
        
        # 通过map高阶函数,返回一个可迭代对象
        erea = map(func_area, [c1, r1])
        print(list(erea))
    

      

      通过标准库operator中methodcaller方法进行调用

    #!/usr/bin/python3
    
    from math import pi
    from operator import methodcaller
    
    
    class Circle(object):
        def __init__(self, radius):
            self.radius = radius
    
        def getArea(self):
            return round(pow(self.radius, 2) * pi, 2)
    
    
    class Rectangle(object):
        def __init__(self, width, height):
            self.width = width
            self.height = height
            
        def get_area(self):
            return self.width * self.height
    
    if __name__ == '__main__':
        c1 = Circle(5.0)
        r1 = Rectangle(4.0, 5.0)
        
        # 第一个参数是函数字符串名字,后面是函数要求传入的参数,执行括号中传入对象
        erea_c1 = methodcaller('getArea')(c1)
        erea_r1 = methodcaller('get_area')(r1)
        print(erea_c1, erea_r1)
    

      

  • 相关阅读:
    洛谷 1339 最短路
    洛谷 1330 封锁阳光大学 图论 二分图染色
    洛谷 1262 间谍网络 Tarjan 图论
    洛谷 1373 dp 小a和uim之大逃离 良心题解
    洛谷 1972 莫队
    洛谷 2158 数论 打表 欧拉函数
    洛谷 1414 数论 分解因数 水题
    蒟蒻的省选复习(不如说是noip普及组复习)————连载中
    关于筛法
    关于整数划分的几类问题
  • 原文地址:https://www.cnblogs.com/2bjiujiu/p/7289961.html
Copyright © 2011-2022 走看看