在 class 实例上执行 class 方法列表

Perform list of class methods on instance of class

如果您有一个 class 有多个方法,例如

class A:
    def a(self):
        return 1
    def b(self):
        return 2
    def c(self):
        return 3

如何在 A 的实例上调用一系列 A 的方法?我尝试了以下

>>> foo = A()
>>> l = [A.a, A.b, A.c]

当我尝试使用列表推导来调用其中的每一个方法时,出现以下错误

>>> [foo.f() for f in l]
Traceback (most recent call last):
  File "<pyshell#21>", line 1, in <module>
    [foo.f() for f in l]
  File "<pyshell#21>", line 1, in <listcomp>
    [foo.f() for f in l]
AttributeError: 'A' object has no attribute 'f'

如果我只看列表中的一项,它应该是一个函数对象

>>> A.a
<function A.a at 0x02F361E0>

那么如何在列表推导中调用实例上的函数呢?它认为我正在尝试调用方法 f,而不是让 f 获取 l.

中每个函数对象的值

我期望的输出是

[1, 2, 3]

我似乎已经弄明白了,但我会 post 一个答案,以防其他人遇到这个问题。方法列表必须从实例本身创建

>>> foo = A()
>>> l = [foo.a, foo.b, foo.c]
>>> [f() for f in l]
[1, 2, 3]

区别在于这些方法现在实际上绑定到A实例

>>> foo.a
<bound method A.a of <__main__.A object at 0x02F381B0>>
>>> A.a
<function A.a at 0x02F361E0>

也可以将 foo 对象作为第一个 (self) 参数传递:

In [1]: class A:
   ...:     def a(self):
   ...:         return 1
   ...:     def b(self):
   ...:         return 2
   ...:     def c(self):
   ...:         return 3
   ...:     

In [2]: foo = A()

In [3]: l = [A.a, A.b, A.c]

In [4]: [f(foo) for f in l]
Out[4]: [1, 2, 3]