如果您有一个包含多种方法的类,例如
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]
答案 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]