2017-05-23 5 views
0

それは愚かな質問かもしれませんが、私はPythonを初めて使っています。私は次のコードセグメントがどのように可能であるかを理解したいと思います。クラスメソッド内のこの関数はどのようにPythonで動作しますか?

class test: 

    def main_method(self): 

     variable = 10; 

     def sub_method(input): 

      return input * variable 

     self.result = sub_method 

obj = test() 

obj.main_method() 

print(obj.result(4)) 

出力:

私の質問:

私はobj.result(4)を実行し、sub_methodを保存するインスタンス変数であること、self.resultし、アクセス権を持っていますかの範囲に10とvariableの値をmain_methodに再実行しないでください。

ありがとうございました。

+2

'sub_method'は自由変数の状態をそれと共に保持しているので。 Pythonは[closures]をサポートしています(https://en.m.wikipedia.org/wiki/Closure_(computer_programming)) –

+0

私はそれについて聞いたことがありません。私はそれをチェックするつもりです。ありがとうございます –

+0

また、用語ニックネ: 'main_method'単なるメソッドではなく、クラスメソッドです。 –

答えて

1

Python関数はclosuresをサポートするので、これは可能である:

操作上、閉鎖機能を格納するレコードである[A]と共に 環境と[1]のマッピングが の各自由変数を関連付けます(ローカルで使用されるが、範囲を囲む で定義された変数)を、クロージャが作成されたときに名前が にバインドされた値または参照と比較します。

実際、Pythonでは、これを簡単に調べることができます。基本的には、各関数はそれへの参照を中心に運ぶ...

In [2]: class test: 
    ...: 
    ...:  def main_method(self): 
    ...: 
    ...:   variable = 10; 
    ...: 
    ...:   def sub_method(input): 
    ...: 
    ...:    return input * variable 
    ...: 
    ...:   self.result = sub_method 
    ...: 
    ...: obj = test() 
    ...: 
    ...: obj.main_method() 
    ...: 

In [3]: obj.result 
Out[3]: <function __main__.test.main_method.<locals>.sub_method> 

をあなたのコードを実行すると、自由変数です:

In [6]: obj.result.__closure__ 
Out[6]: (<cell at 0x10448ff78: int object at 0x100214990>,) 

In [7]: obj.result.__closure__[0].cell_contents 
Out[7]: 10 

そして、それさえ名前は自由変数は、イントロスペクションされています:

In [8]: obj.result.__code__.co_freevars 
Out[8]: ('variable',) 

Pythonでは、関数は単なる別の種類のオブジェクトです。

関連する問題