8.20 通过å—符串调用对象方法¶
问题¶
ä½ æœ‰ä¸€ä¸ªå—符串形å¼�的方法å��称,想通过它调用æŸ�个对象的对应方法。
解决方案¶
最简�的情况,�以使用 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) # Calls 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() æ�¥æŸ¥æ‰¾åˆ°è¿™ä¸ªå±žæ€§ï¼Œç„¶å�Žå†�去以函数方å¼�调用它å�³å�¯ã€‚
operator.methodcaller() 创建一个�调用对象,并�时�供所有必��数,
ç„¶å�Žè°ƒç”¨çš„æ—¶å€™å�ªéœ€è¦�å°†å®žä¾‹å¯¹è±¡ä¼ é€’ç»™å®ƒå�³å�¯ï¼Œæ¯”如:
>>> p = Point(3, 4)
>>> d = operator.methodcaller('distance', 0, 0)
>>> d(p)
5.0
>>>
通过方法å��ç§°å—符串æ�¥è°ƒç”¨æ–¹æ³•通常出现在需è¦�模拟 case è¯å�¥æˆ–实现访问者模å¼�的时候。
å�‚考下一å°�节获å�–更多高级例å�。