質問するログイン新規登録

質問編集履歴

6

スケルトンコードの追記

2016/08/22 07:56

投稿

snowfaller
snowfaller

スコア125

title CHANGED
File without changes
body CHANGED
@@ -45,4 +45,34 @@
45
45
  inst = Test()
46
46
  inst.undefinedTestMethod()
47
47
  if(__name__ == '__main__'):main()
48
+ ```
49
+
50
+ 【後記3】
51
+ 以下をベースに肉付けしていきます。
52
+ ```python
53
+ #!/usr/bin/env python3
54
+ from os.path import basename, splitext
55
+ class Original:
56
+ def __init__(self):
57
+ self.testProperty = 'text of testProperty'
58
+ def testMethod(self, text):
59
+ print('testMethod() has been called with \'%s\'' % text)
60
+ class Proxy:
61
+ def __init__(self, moduleName, className):
62
+ self.orgInst = getattr(__import__(moduleName, fromlist=[className]), className)()
63
+ def __getattr__(self, name):
64
+ attr = getattr(self.orgInst, name)
65
+ if(callable(attr)):
66
+ print('*redirecting method %s' % name)
67
+ # メソッドを呼び出す際の処理
68
+ else:
69
+ print('*redirecting property %s' % name)
70
+ # プロパティを取得する際の処理
71
+ return attr
72
+ def main():
73
+ inst = Proxy(splitext(basename(__file__))[0], 'Original')
74
+ print(inst.testProperty)
75
+ inst.testMethod('Hello')
76
+ inst.testMethod2('This invokation will be failed')
77
+ if(__name__ == '__main__'):main()
48
78
  ```

5

pythonのコードを追記

2016/08/22 07:56

投稿

snowfaller
snowfaller

スコア125

title CHANGED
File without changes
body CHANGED
@@ -16,7 +16,6 @@
16
16
  $inst = new Test();
17
17
  $inst->undefinedTestMethod();
18
18
  ?>
19
-
20
19
  ```
21
20
  これらに該当するPythonの関数をご教授下さい。
22
21
  前にそのコールバック関数を一度実装したのですが、忘れてしまいました。
@@ -29,4 +28,21 @@
29
28
  【後記】
30
29
  皆様、ご回答ありがとうございました。
31
30
  DBのConnectionクラスのProxy(代理人)クラスを作成する上で必要でした。
32
- PHPのマジックメソッドやPythonの特殊メソッドを使用すれば、Javaと比べて、(厳格性には欠けます)非常に、お手軽に実装出来ますね。
31
+ PHPのマジックメソッドやPythonの特殊メソッドを使用すれば、Javaと比べて、(厳格性には欠けます)非常に、お手軽に実装出来ますね。
32
+
33
+ 【後記2】
34
+ ご回答頂いた内容をよく確認したところ、phpの```__call()```では、その延長で本来のメソッドを呼び出すのですが、pythonの```__getattr__()```はメソッドのオブジェクトを返す必要があるのですね(その後、pythonがそのメソッドを呼び出す)。
35
+ 先のphpのコードをpythonに焼きなおすと以下の通りになるかと。(双方共に細かいエラー処理は省略)
36
+ ```python
37
+ #!/usr/bin/env python3
38
+ class Test:
39
+ def dummy(self, *args):
40
+ None
41
+ def __getattr__(self, name):
42
+ print('Undefined function %s() has been called.' % name)
43
+ return self.dummy
44
+ def main():
45
+ inst = Test()
46
+ inst.undefinedTestMethod()
47
+ if(__name__ == '__main__'):main()
48
+ ```

4

結果の記入

2016/08/22 06:58

投稿

snowfaller
snowfaller

スコア125

title CHANGED
File without changes
body CHANGED
@@ -24,4 +24,9 @@
24
24
 
25
25
  「やってほしいことだけを記載した丸投げの質問」との指摘を受けましたが、これ以上どのように質問して良いのか正直分かりません。
26
26
  → マジックメソッドの補足を追加してみました。
27
- → もうちょっと補足を追加してみました。
27
+ → もうちょっと補足を追加してみました。
28
+
29
+ 【後記】
30
+ 皆様、ご回答ありがとうございました。
31
+ DBのConnectionクラスのProxy(代理人)クラスを作成する上で必要でした。
32
+ PHPのマジックメソッドやPythonの特殊メソッドを使用すれば、Javaと比べて、(厳格性には欠けます)非常に、お手軽に実装出来ますね。

3

もうちょっと補足を追加してみました。

2016/08/21 12:07

投稿

snowfaller
snowfaller

スコア125

title CHANGED
File without changes
body CHANGED
@@ -1,10 +1,27 @@
1
+ PHPのメソッドに未定義な関数の呼び出しやプロパティの設定・取得が行われた時に、PHPから呼び出してくれる(いわゆるコールバックしてくれるマジックメソッドがあります。
2
+
1
3
  ```php
4
+ #!/usr/bin/env php
5
+ <?php
6
+ /*
2
- __call() /* 未定義な関数が呼ばれた時に、その関数名と引数が指定されて呼び出されます */
7
+ __call() : 未定義な関数が呼ばれた時に、その関数名と引数が指定されて呼び出されます
3
- __get() /* 未定義なプロパティを取得しようとした時に、そのプロパティ名が指定されて呼び出されます */
8
+ __get() : 未定義なプロパティを取得しようとした時に、そのプロパティ名が指定されて呼び出されます
4
- __set() /* 未定義なプロパティを設定しようとした時に、そのプロパティ名と値がしていされて呼び出されます */
9
+ __set() : 未定義なプロパティを設定しようとした時に、そのプロパティ名と値が指定されて呼び出されます
10
+ */
11
+ class Test {
12
+ public function __call($functionName, $args) {
13
+ printf("Undefined function %s() has been called.\n", $functionName);
14
+ }
15
+ }
16
+ $inst = new Test();
17
+ $inst->undefinedTestMethod();
18
+ ?>
19
+
5
20
  ```
6
- に該当するPythonの関数をご教授下さい。
21
+ これらに該当するPythonの関数をご教授下さい。
7
- 前に一度実装したのですが、忘れてしまいました。
22
+ 前にそのコールバック関数を一度実装したのですが、忘れてしまいました。
23
+ (コールバックする側の実装ではなく、コールバックされた側の実装を単純にしたいだけです)
8
24
 
9
25
  「やってほしいことだけを記載した丸投げの質問」との指摘を受けましたが、これ以上どのように質問して良いのか正直分かりません。
10
- → マジックメソッドの補足を追加してみました。
26
+ → マジックメソッドの補足を追加してみました。
27
+ → もうちょっと補足を追加してみました。

2

マジックメソッドの補足を追加してみました。

2016/08/21 05:33

投稿

snowfaller
snowfaller

スコア125

title CHANGED
File without changes
body CHANGED
@@ -1,9 +1,10 @@
1
1
  ```php
2
- __call()
2
+ __call() /* 未定義な関数が呼ばれた時に、その関数名と引数が指定されて呼び出されます */
3
- __get()
3
+ __get() /* 未定義なプロパティを取得しようとした時に、そのプロパティ名が指定されて呼び出されます */
4
- __set()
4
+ __set() /* 未定義なプロパティを設定しようとした時に、そのプロパティ名と値がしていされて呼び出されます */
5
5
  ```
6
6
  に該当するPythonの関数をご教授下さい。
7
7
  前に一度実装したのですが、忘れてしまいました。
8
8
 
9
- 「やってほしいことだけを記載した丸投げの質問」との指摘を受けましたが、これ以上どのように質問して良いのか正直分かりません。
9
+ 「やってほしいことだけを記載した丸投げの質問」との指摘を受けましたが、これ以上どのように質問して良いのか正直分かりません。
10
+ → マジックメソッドの補足を追加してみました。

1

「やってほしいことだけを記載した丸投げの質問」との指摘を受けましたが、これ以上どのように質問して良いのか正直分かりません。

2016/08/21 05:07

投稿

snowfaller
snowfaller

スコア125

title CHANGED
File without changes
body CHANGED
@@ -4,4 +4,6 @@
4
4
  __set()
5
5
  ```
6
6
  に該当するPythonの関数をご教授下さい。
7
- 前に一度実装したのですが、忘れてしまいました。
7
+ 前に一度実装したのですが、忘れてしまいました。
8
+
9
+ 「やってほしいことだけを記載した丸投げの質問」との指摘を受けましたが、これ以上どのように質問して良いのか正直分かりません。