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 条评论
登录 后参与评论

相关文章

来自专栏web前端教室

简单的说下,(function(){...})() 与 (function(){...}()) 有什么区别?

大周末的写太长了也没人看,标题所提问,其实没有区别, function xxx(){...},这是一个函数,解释器知道了,但并不运行它; xxx(),解释器遇到...

1756
来自专栏向治洪

迭代子模式

概述 概念:在阎宏博士的《JAVA与模式》中关于迭代子模式的定义是这样的:迭代子模式又叫游标(Cursor)模式,是对象的行为模式。迭代子模式可以顺序地访问一个...

1777
来自专栏Python攻城狮

MySQL中char、varchar和text的区别

它们的存储方式和数据的检索方式都不一样。 数据的检索效率是:char > varchar > text 空间占用方面,就要具体情况具体分析了。

664
来自专栏python学习指南

Python爬虫(十)_正则表达式

本篇将介绍python正则表达式,更多内容请参考:【python正则表达式】 什么是正则表达式 正则表达式,又称规则表达式,通常被用来检索、替换那些符合某...

1916
来自专栏互联网杂技

在用sea.js进行模块化开发前,应该知道一些知识点

先看问题: <!doctype html> <html> <head> <meta charset="UTF-8"> <title>变量作用域问题</title...

3258
来自专栏黄Java的地盘

正则表达式之入门篇

本文主要通过对正则表达式的语法进行一些简单的介绍,从而让没有接触过或者想学习正则表达式的同学有一个基础的了解,从而能够看懂和编写使用一般的正则表达式。

891
来自专栏GreenLeaves

Oracle PL/SQL编程之变量

注: 以下测试案例所用的表均来自与scott方案,使用前,请确保该用户解锁. 1、简介 和大多数编程语言一样,在编写PL/SQL程序时,可以定义常量和变量,在p...

1867
来自专栏函数式编程语言及工具

FunDA(8)- Static Source:保证资源使用安全 - Resource Safety

   我们在前面用了许多章节来讨论如何把数据从后台数据库中搬到内存,然后进行逐行操作运算。我们选定的解决方案是把后台数据转换成内存中的数据流。无论在打开数据库表...

19410
来自专栏C/C++基础

C++函数指针简介

(1)定义函数指针的语法形式比较复杂,常借助于typedef类型定义符来简化函数指针的定义。

371
来自专栏码云1024

C#泛型

2644

扫码关注云+社区