0

質問は紛らわしいです。これが例です。

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

これは大丈夫ですよね?私は持っている必要はありません:selfを呼び出すためのanother_fun(self)?私は実際にそれをテストしました、そしてそれは働きます。少し不安になるので、説明が必要でした。

4

2 に答える 2

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

于 2012-11-22T00:16:35.237 に答える
2

はい、ある関数を別の関数の内部で定義すると、内部の関数は外部の関数から変数を読み取ることができます。これはに固有のものではありませんself。これは、すべての関数のすべての変数に対して機能します。

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

Python 2では、内部関数で外部変数を再バインドすることはできません(つまり、上記のa = 3内部で再バインドすることはできませんinner)。nonlocalPython 3では、ステートメントを使用してこれを行うことができます。

しかし、なぜあなたはこれをしているのですか?そもそも、上記のコードはを呼び出さないanother_funので、それが行うことは重要ではありません。一般に、他の関数内で関数を定義することは少し奇妙なことです。それを行うための正当なケース(デコレータなど)は確かにありますが、多くの場合、混乱を引き起こす可能性があります。

于 2012-11-22T00:16:21.487 に答える