元组中的方法需要显式的 `self` 参数

7

我想了解这段代码为什么能够工作:

class MyClass(object):
    def f(self): print "Hello"
    ff = f
    def g(self): self.ff()

MyClass().g()

虽然这个不会:
class MyClass(object):
    def f(self): print "Hello"
    ff = f,
    def g(self): self.ff[0]()

MyClass().g()

由于它需要一个参数 self.ff[0](self)

TypeError: f() takes exactly 1 argument (0 given)

在之前的情况下,self.ff == self.f,那么self.ff[0] == self.f不是也成立吗?


我不是100%确定,但是方法指的是类成员函数。在你的第二个例子中,ff是一个元组而不是一个函数,ff[0]也并非MyClass的成员。它只是一个函数。 - Håken Lid
为什么 ff[0] 不是该类的成员? - Ruggero Turra
这个标题更好吗?这是一个有趣的问题,谢谢提问! - Adam Smith
1个回答

3

当您打印类的成员时,您可以看到差异。

对于您的第一个示例,您会发现该函数被包装为一个(非)绑定方法,它会为您处理self参数:

>>> MyClass.ff
<unbound method MyClass.f>
>>> MyClass().ff
<bound method MyClass.f of <__main__.MyClass object at 0x7f53>>

而在你的第二个例子中,该函数被用作普通函数:

>>> MyClass.ff[0]
<function f at 0x7f54>
>>> MyClass().ff[0]
<function f at 0x7f54>

让我们转换一下问题:为什么在第二种情况下 MyClass.ff[0] != MyClass.f - Ruggero Turra
由于同样的原因,@RuggeroTurra。MyClass.ff[0]是一个函数,而MyClass.f是一个未绑定的方法,它包装了这个函数。 - tynn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接