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)

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM