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