PHPのメソッドに未定義な関数の呼び出しやプロパティの設定・取得が行われた時に、PHPから呼び出してくれる(いわゆるコールバックしてくれるマジックメソッドがあります。
php
1#!/usr/bin/env php 2<?php 3/* 4__call() : 未定義な関数が呼ばれた時に、その関数名と引数が指定されて呼び出されます 5__get() : 未定義なプロパティを取得しようとした時に、そのプロパティ名が指定されて呼び出されます 6__set() : 未定義なプロパティを設定しようとした時に、そのプロパティ名と値が指定されて呼び出されます 7*/ 8class Test { 9 public function __call($functionName, $args) { 10 printf("Undefined function %s() has been called.\n", $functionName); 11 } 12} 13$inst = new Test(); 14$inst->undefinedTestMethod(); 15?>
これらに該当するPythonの関数をご教授下さい。
前にそのコールバック関数を一度実装したのですが、忘れてしまいました。
(コールバックする側の実装ではなく、コールバックされた側の実装を単純にしたいだけです)
「やってほしいことだけを記載した丸投げの質問」との指摘を受けましたが、これ以上どのように質問して良いのか正直分かりません。
→ マジックメソッドの補足を追加してみました。
→ もうちょっと補足を追加してみました。
【後記】
皆様、ご回答ありがとうございました。
DBのConnectionクラスのProxy(代理人)クラスを作成する上で必要でした。
PHPのマジックメソッドやPythonの特殊メソッドを使用すれば、Javaと比べて、(厳格性には欠けます)非常に、お手軽に実装出来ますね。
【後記2】
ご回答頂いた内容をよく確認したところ、phpの__call()
では、その延長で本来のメソッドを呼び出すのですが、pythonの__getattr__()
はメソッドのオブジェクトを返す必要があるのですね(その後、pythonがそのメソッドを呼び出す)。
先のphpのコードをpythonに焼きなおすと以下の通りになるかと。(双方共に細かいエラー処理は省略)
python
1#!/usr/bin/env python3 2class Test: 3 def dummy(self, *args): 4 None 5 def __getattr__(self, name): 6 print('Undefined function %s() has been called.' % name) 7 return self.dummy 8def main(): 9 inst = Test() 10 inst.undefinedTestMethod() 11if(__name__ == '__main__'):main()
【後記3】
以下をベースに肉付けしていきます。
python
1#!/usr/bin/env python3 2from os.path import basename, splitext 3class Original: 4 def __init__(self): 5 self.testProperty = 'text of testProperty' 6 def testMethod(self, text): 7 print('testMethod() has been called with \'%s\'' % text) 8class Proxy: 9 def __init__(self, moduleName, className): 10 self.orgInst = getattr(__import__(moduleName, fromlist=[className]), className)() 11 def __getattr__(self, name): 12 attr = getattr(self.orgInst, name) 13 if(callable(attr)): 14 print('*redirecting method %s' % name) 15 # メソッドを呼び出す際の処理 16 else: 17 print('*redirecting property %s' % name) 18 # プロパティを取得する際の処理 19 return attr 20def main(): 21 inst = Proxy(splitext(basename(__file__))[0], 'Original') 22 print(inst.testProperty) 23 inst.testMethod('Hello') 24 inst.testMethod2('This invokation will be failed') 25if(__name__ == '__main__'):main()

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/08/21 11:40