如何通过实例方法名字的字符串调用方法?

Posted richardo-m-q

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何通过实例方法名字的字符串调用方法?相关的知识,希望对你有一定的参考价值。

需求:
某项目中,我们的代码使用了三个不同库中的图形类,Circle,Triangle,Rectangle
他们都有一个获取图形面积的接口(方法)但是接口名字不同,我们实现一个统一获取面积的函数,使用每种方法名进行尝试,调用相应类的接口

思路:
1、使用内置函数getattr,通过名称在实例上获取方法对象,然后调用
2、使用标准库下operator下的methodcaller函数调用

代码:

方法一:
lib1.py:

class Circle(object):
    def __init__(self,r):
        self.r = r

    def area(self):
        return self.r ** 2 * 3.14

lib2.py:

class Triangle(object):
    def __init__(self,a,b,c):
        self.a = a
        self.b = b
        self.c = c

    def getArea(self):
        a,b,c = self.a,self.b,self.c
        p = (a+b+c)/2
        area = (p * (p -a) * (p - b )*(p - c)) ** 0.5
        return area

lib3.py:

class Rectangle(object):
    def __init__(self,w,h):
        self.w = w
        self.h = h

    def get_area(self):
        return self.w * self.h

test.py:

from lib1 import Circle
from lib2 import Triangle
from lib3 import Rectangle

# 统一计算面积函数的接口
def getArea(shape):
    for name in (‘area‘,‘getArea‘,‘get_area‘):
        f = getattr(shape,name,None) # 这里如果shape不存在属性name,则返回None
        if f:  # 如果存在,则返回计算的结果
            return f()


shape1 = Circle(2)
shape2 = Triangle(3,4,5)
shape3 = Rectangle(6,4)

shapes = [shape1,shape2,shape3]
print map(getArea,shapes)

方法二:
In [15]: from operator import methodcaller

In [16]: methodcaller?
Init signature: methodcaller(self, /, *args, **kwargs)
Docstring:
methodcaller(name, ...) --> methodcaller object

Return a callable object that calls the given method on its operand.
After f = methodcaller(‘name‘), the call f(r) returns r.name().
After g = methodcaller(‘name‘, ‘date‘, foo=1), the call g(r) returns
r.name(‘date‘, foo=1).
File:           /usr/local/python3/lib/python3.7/operator.py
Type:           type
Subclasses:

In [17]: s = ‘abc123abc456‘

In [18]: s.find(‘abc‘,4)
Out[18]: 6

In [19]: methodcaller(‘find‘,‘abc‘,4)
Out[19]: operator.methodcaller(‘find‘, ‘abc‘, 4)

In [20]: methodcaller(‘find‘,‘abc‘,4)(s)
Out[20]: 6




以上是关于如何通过实例方法名字的字符串调用方法?的主要内容,如果未能解决你的问题,请参考以下文章

7-8 如何通过实例方法名字的字符串调用方法

python_如何通过实例方法名字调用方法?

从意图活动访问片段方法

如果使用实例化对象,来为类动态的添加一个 字符串形式的 方法。

java中如何通过一个字符串来实例化一个类并调用其中方法

如何通过代码设置片段标签?