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

案例:

某项目中,我们的代码使用的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)

  

时间: 2024-11-10 16:14:58

python_如何通过实例方法名字调用方法?的相关文章

Delphi按名字调用方法高级解决方案

Delphi按名字调用方法高级解决方案 博客分类: 编程基础 DelphiJ#ASPDOS数据结构 按名字调用方法似乎一直以来都是大家比较关注的技术,在论坛上有一个经典的答复: type    TProcedure = procedure(Test: string) of object; procedure ExecuteRoutine(Obj: TObject; Name, Param: string);  var    PMethod: TMethod;    AProcedure: TPr

python类与对象-如何通过实例方法名字的字符串调用方法

如何通过实例方法名字的字符串调用方法 问题举例 在某项目中我们的代码用了三个不同库中的图形类:Circle,Triangle,Rectangle 它们都有一个获取图形面积的接口,单接口名字可能不同,我们可以实现一个统一的获取 面积的函数,使用每种方法名进行尝试,调用相应类的接口. 解决思路 方法一:使用内置函数getattr, 通过名字获取方法对象然后调用 方法二:使用标准库operator下的methodcaller函数调用 代码 from lib1 import Circle from li

Atitit.编程语言原理---方法重载的实现与设计 调用方法的原理

Atitit.编程语言原理---方法重载的实现与设计 调用方法的原理 1. 重载包括:普通方法的重载和构造方法的重载 1 1.1. 横向重载”和“纵向重载”1 1.2. 方法签名通过  方法名称,参数数量,参数类型+返回类型 参数顺序(命名参数)来组成1 1.3. 重载(重新载选方法流程,如下图所示2 2. 重载的实现方法::argus参数 vs  默认值.可选参数法 可选参数3 2.1. __call()函数是php类的默认魔法函数 3 2.2. Java通过反射调用方法重载 执行方法4 2.

Swift:实例方法和类型方法

大家对"实例方法和类型方法"的概念应该不陌生了,在objective-c中很常见.例如: 1. 实例方法(减号开头) - (instancetype)init; 调用的时候,必须先进行实例化一个对象(alloc), 然后调用init方法. 2. 类型方法(加号开头) + (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations 调用的时候,直接使用UIView的类型就

Lua中“.”调用方法与“:”调用方法的区别

Lua中"."调用方法与":"调用方法的区别:                                                                                                                         一.概述 学lua的时候有一个迷惑点,就是搞不清楚'.'与':'调用方法的区别,今天很早就起来看了看一个大牛的视频讲解,才顿悟了:'.'调用和':'实际是传递参数的个数不同而已,':

通过反射获取及调用方法(Method)

1.获取方法使用反射获取某一个类中的方法,步骤:①找到获取方法所在类的字节码对象②找到需要被获取的方法 Class类中常用方法: public Method[] getMethods():获取包括自身和继承过来的所有的public方法 public Method[] getDeclaredMethods():获取自身所有的方法(不包括继承的,和访问权限无关) public Method getMethod(String methodName,Class<?>...parameterTypes)

使用反射构造对象实例并动态调用方法

在.Net 中,程序集(Assembly)中保存了元数据(MetaData)信息,因此就可以通过分析元数据来获取程序集中的内容,比如类,方法,属性等,这大大方便了在运行时去动态创建实例. MSDN解释如下: 反射提供了封装程序集.模块和类型的对象(Type 类型).可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性.如果代码中使用了属性,可以利用反射对它们进行访问. 主要用途: 动态加载DLL,实现插件机制. 实例化DLL中的类型. 执行后期

静态方法、实例方法和虚方法的区别

基础知识 对于面向对象的语言来说,所有类型都是从System.Object类型派生,正是由于这个原因,保证了每个类型都有一组最基本的方法,也就是从他们的父类System.Object继承古来的方法,Object的定义如下面的代码所示,System.Object所定义的基本方法中基本包含了CLR所有的方法类型,静态方法(Static修饰,属于类成员).虚方法(Virtural修饰,属于实例成员).实例方法(普通的方法,属于实例成员).可能会有人说还有抽象方法,其实抽象方法最后的编译也是一个虚方法.

NDK开发之调用方法

与NDK开发之访问域中介绍的一样,Java中的方法也是分为两类:实例方法和静态方法.JNI提供了访问两类方法的函数,下面我们一起来看看怎么在C中访问Java中的方法. 我们的MainActivity中有两个方法,分别是: private String instanceMethod(){ return "Instance Method"; } private static String staticMethod(){ return "static Method"; }