python(関数ポインタとクラス関数ポインタ)


【声明:著作権所有、転載歓迎、商業用途に使用しないでください.連絡ポスト:[email protected]
関数ポインタとクラス関数ポインタはc言語の下にある概念が簡単で、スクリプトの下に使うのも便利です.スクリプト言語はすべてのタイプがオブジェクトであるため、ポインタの概念は存在しません.普通、私たちはこのように使っています.
feixiaoxingdeMacBook-Pro-4:~ feixiaoxing$ python
Python 2.7.13 (default, Dec 18 2016, 07:03:34) 
[GCC 4.2.1 Compatible Apple LLVM 7.0.2 (clang-700.1.81)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> def process(f):
...     f(1,2,3)
... 
>>> def add(a,b,c):
...     print a,b,c
... 
>>> process(add)
1 2 3
>>> 

この方法は一般的な関数に用いられても問題はない.でもクラス関数に使うとちょっと面倒ですが、
feixiaoxingdeMacBook-Pro-4:~ feixiaoxing$ python
Python 2.7.13 (default, Dec 18 2016, 07:03:34) 
[GCC 4.2.1 Compatible Apple LLVM 7.0.2 (clang-700.1.81)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> def process(f):
...     f(1,2,3)
... 
>>> class A:
...     def run(self,a,b,c):
...             print a,b,c
... 
>>> process(A.run)
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 2, in process
TypeError: unbound method run() must be called with A instance as first argument (got int instance instead)
>>> 

システムから与えられたアラート情報により、pythonはどのようにするかを示しています.肝心なのはclassインスタンスを定義し、このインスタンスに関数を加えてコールバック関数として使用すればいいのです.
feixiaoxingdeMacBook-Pro-4:~ feixiaoxing$ python
Python 2.7.13 (default, Dec 18 2016, 07:03:34) 
[GCC 4.2.1 Compatible Apple LLVM 7.0.2 (clang-700.1.81)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> def process(f):
...     f(1,2,3)
... 
>>> class A:
...     def run(self,a,b,c):
...             print a,b,c
... 
>>> val=A()
>>> process(val.run)
1 2 3
>>> 

コードからクラス関数は複雑ではないことがわかります.クラスインスタンスとクラス関数自体を関連付けるだけで、通常の関数のパラメータとして使用できます.