W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
你有一個(gè)字符串形式的方法名稱,想通過它調(diào)用某個(gè)對象的對應(yīng)方法。
最簡單的情況,可以使用 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)
當(dāng)你需要通過相同的參數(shù)多次調(diào)用某個(gè)方法時(shí),使用 operator.methodcaller
就很方便了。比如你需要排序一系列的點(diǎn),就可以這樣做:
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))
調(diào)用一個(gè)方法實(shí)際上是兩部獨(dú)立操作,第一步是查找屬性,第二步是函數(shù)調(diào)用。因此,為了調(diào)用某個(gè)方法,你可以首先通過 getattr()
來查找到這個(gè)屬性,然后再去以函數(shù)方式調(diào)用它即可。
operator.methodcaller()
創(chuàng)建一個(gè)可調(diào)用對象,并同時(shí)提供所有必要參數(shù),然后調(diào)用的時(shí)候只需要將實(shí)例對象傳遞給它即可,比如:
>>> p = Point(3, 4)
>>> d = operator.methodcaller('distance', 0, 0)
>>> d(p)
5.0
>>>
通過方法名稱字符串來調(diào)用方法通常出現(xiàn)在需要模擬 case
語句或?qū)崿F(xiàn)訪問者模式的時(shí)候。參考下一小節(jié)獲取更多高級例子。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: