Python self:我是否必须将self传递给函数来引用self?

时间:2012-11-22 00:11:56

标签: python

问题令人困惑。这是一个例子。

class some_class():
  some_var = 5
  def some_fun(self):
     def another_fun():
         return self.some_var

这没关系吗?我没有:another_fun(self)给自己打电话? 我实际测试了它,它的工作原理。我只想澄清一些,因为它让我有点不确定。

2 个答案:

答案 0 :(得分:5)

在您的情况下,不需要它,因为another_fun嵌套在其他函数中,因此从该函数中捕获本地名称,其中包括self。实际上,也可以从some_fun访问another_fun中可访问的任何名称。

有些人称之为闭包,编写创建函数的函数非常棒。经典的例子是:

def MultiplyBy(x):
    def M(y):
        return x * y
    return M

Double = MultiplyBy(2)
Triple = MultiplyBy(3)

print Double(10), Triple(10)

这将打印20 30

答案 1 :(得分:2)

是的,当你在另一个函数中定义一个函数时,内部函数可以从外部函数中读取变量。这与self无关。它适用于所有函数中的所有变量:

>>> def outer():
...     a = 2
...     def inner():
...         print a
...     inner()
>>> outer()
2

在Python 2中,你不能在内部函数中重新绑定外部变量(即,你不能在a = 3里面inner执行。在Python 3中,您可以使用nonlocal语句执行此操作。

但是,你为什么要这样做?首先,上面的代码甚至不会调用another_fun,因此它的作用并不重要。一般来说,在其他函数中定义函数有点奇怪。这样做肯定是合法的(例如,装饰者),但在许多情况下,它可能会引起混淆。