国产chinesehdxxxx野外,国产av无码专区亚洲av琪琪,播放男人添女人下边视频,成人国产精品一区二区免费看,chinese丰满人妻videos

8.20 通過(guò)字符串調(diào)用對(duì)象方法

2018-02-24 15:26 更新

問(wèn)題

你有一個(gè)字符串形式的方法名稱,想通過(guò)它調(diào)用某個(gè)對(duì)象的對(duì)應(yīng)方法。

解決方案

最簡(jiǎn)單的情況,可以使用 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)你需要通過(guò)相同的參數(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è)方法,你可以首先通過(guò) getattr() 來(lái)查找到這個(gè)屬性,然后再去以函數(shù)方式調(diào)用它即可。

operator.methodcaller() 創(chuàng)建一個(gè)可調(diào)用對(duì)象,并同時(shí)提供所有必要參數(shù),然后調(diào)用的時(shí)候只需要將實(shí)例對(duì)象傳遞給它即可,比如:

>>> p = Point(3, 4)
>>> d = operator.methodcaller('distance', 0, 0)
>>> d(p)
5.0
>>>

通過(guò)方法名稱字符串來(lái)調(diào)用方法通常出現(xiàn)在需要模擬 case 語(yǔ)句或?qū)崿F(xiàn)訪問(wèn)者模式的時(shí)候。參考下一小節(jié)獲取更多高級(jí)例子。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)