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

调用对象的方法,一般分为两步,首先查找对象的属性中是否包含该方法名称,然后是调用函数。
对于简单的情形,可以使用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()查找属性,就如同其他任何属性一样。 要将结果作为方法调用,只需将查找结果视为函数。

posted @ 2020-01-06 23:08  Jeffrey_Yang  阅读(231)  评论(0编辑  收藏  举报