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

Posted jeffrey-yang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在对象上调用以字符串作为名称的方法相关的知识,希望对你有一定的参考价值。

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

以上是关于在对象上调用以字符串作为名称的方法的主要内容,如果未能解决你的问题,请参考以下文章

html/javascript onsubmit 事件未在表单提交上调用以验证表单

如何通过代码设置片段标签?

Java方法

如何从 C# 代码的库中调用 C 方法?

使用字符串(不是HTML)以表格格式显示对象数组。

托管对象之外的 NSManagedObject 子类作为普通对象