python学习笔记6.9-通过字符串访问类的方法

我们想调用对象上的某一个方法,这个方法名保存在字符串中,我们想通过这个字符串来调用该方法。

1 使用getattr()

import math

class Point:
    def __init__(self,x,y):
        self.x = x
        self.y = y

    def __repr__(self):
        return 'Point({!r:},{!r:}'.format(self.x, self.y)

    def distance(self,x,y):
        return math.hypot(self.x-x, self.y-y)

p = Point(2, 3)

d = getattr(p, 'distance')(0, 0)

通过getattr()就可以寻找到相关方法并返回该方法,直接用就可以

2 使用operator.methodcaller()

import operator
d = operator.methodcaller('distance', 0, 0)(p)
print(d)

同样也达到了我们想要的结果。

如果想通过名称来查询方法并提供同样的参数反复调用该方法,那么operator.methodcaller()是很有用的。

points = [Point(12,5),Point(3,4),Point(6,9)]
print(points)

points.sort(key=operator.methodcaller('distance',0,0))
print(points)

调用一个方法实际上涉及到两个单独的步骤,一个时查询属性,一个时函数调用,因此要调用一个方法,可以使用getattr()来查询相应的方法,只要把查询到的方法当做函数使用就好。 与getattr()不同的是,operator.methodcaller()创建了一个可以调用的方法,我们需要为其提供相应的self参数,也就是相应的对象的实例就可以直接使用。

通过包含在字符串中的名称来调用方法,这种方式常出现在需要模拟case语句或者访问者模式的变体中,以后在分享更加高级的访问者模式。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏C语言及其他语言

[蓝桥杯]时间转换

题目描述 给定一个以秒为单位的时间t,要求用 “< H> :< M> :< S> ”的格式来表示这个时间。< H> 表示时间,< M> 表示分钟, 而< S...

34511
来自专栏计算机视觉

Python 函数使用记录,join函数和os.path.join用法

1.join()函数 语法:‘sep’.join(seq) 参数说明: sep:分隔符。可以为空 seq:要连接的元素序列、字符串、元组、字典等 上面的语法即:...

39212
来自专栏数据结构与算法

05:最大值和最小值的差

05:最大值和最小值的差 总时间限制:1000ms内存限制:65536kB描述 输出一个整数序列中最大的数和最小的数的差。 输入第一行为M,表示整数个数,整数个...

3315
来自专栏天天

数据储存

652
来自专栏青青天空树

2017-统计字符个数

输入:输入数据有多行,第一行是一个整数n,表示测试实例的个数,后面跟着n行,每行包括一个由字母和数字组成的字符串。

741
来自专栏计算机视觉

Python 函数使用记录,join函数和os.path.join用法

1.join()函数 语法:‘sep’.join(seq) 参数说明: sep:分隔符。可以为空 seq:要连接的元素序列、字符串、元组、字典等 上面的语法即:...

2517
来自专栏和蔼的张星的图像处理专栏

684. 缺少的字符串分解到vector中借助find函数

先把两个字符串都分解到vector中,以空格为标志,然后在借助find函数来找出两个vector中不同的单词。

943
来自专栏深度学习之tensorflow实战篇

python 字典操作提取key,value

python 字典操作提取key,value dictionaryName[key] = value 1.为字典增加一项 ? 2.访问字典中的值 ...

3635
来自专栏遊俠扎彪

C++中的字符数组、字符串、字符指针的一些笔记

1、sizeof会计算实际内存空间,strlen会计算C风格的字符串的实际字符数(不包括\0)。

17710
来自专栏java小白

JAVA协变返回类型

1754

扫码关注云+社区