码迷,mamicode.com
首页 > 其他好文 > 详细

在对象上调用以字符串作为名称的方法

时间:2020-01-07 00:39:43      阅读:94      评论:0      收藏:0      [点我收藏+]

标签:有用   eth   步骤   名称查找   其他   key   class   方法   distance   

调用对象的方法,一般分为两步,首先查找对象的属性中是否包含该方法名称,然后是调用函数。
对于简单的情形,可以使用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)

另一个方案是使用operator模块的methodcaller()函数,如下:

import operator
operator.methodcaller('distance', 0, 0)(p)

如果要按名称查找方法并一次又一次地提供相同的参数,operator.methodcaller()可能会很有用。如下:

points = [Point(1, 2), Point(3, 0), Point(10, -3), Point(-5, -7), Point(-1, 8), Point(3, 2)]

# Sort by distance from origin (0, 0)
points.sort(key=operator.methodcaller('distance', 0, 0))

调用方法实际上是两个单独的步骤,涉及属性查找和函数调用。 因此,要调用方法,只需使用getattr()查找属性,就如同其他任何属性一样。 要将结果作为方法调用,只需将查找结果视为函数。

在对象上调用以字符串作为名称的方法

标签:有用   eth   步骤   名称查找   其他   key   class   方法   distance   

原文地址:https://www.cnblogs.com/jeffrey-yang/p/12159050.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!