在类的实例上执行类方法列表

时间:2015-06-05 15:14:29

标签: python list-comprehension class-method

如果您有一个包含多种方法的类,例如

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]

2 个答案:

答案 0 :(得分:4)

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

>>> 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>

答案 1 :(得分:2)

也可以将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]