質問編集履歴

6

スケルトンコードの追記

2016/08/22 07:56

投稿

snowfaller
snowfaller

スコア125

test CHANGED
File without changes
test CHANGED
@@ -93,3 +93,63 @@
93
93
  if(__name__ == '__main__'):main()
94
94
 
95
95
  ```
96
+
97
+
98
+
99
+ 【後記3】
100
+
101
+ 以下をベースに肉付けしていきます。
102
+
103
+ ```python
104
+
105
+ #!/usr/bin/env python3
106
+
107
+ from os.path import basename, splitext
108
+
109
+ class Original:
110
+
111
+ def __init__(self):
112
+
113
+ self.testProperty = 'text of testProperty'
114
+
115
+ def testMethod(self, text):
116
+
117
+ print('testMethod() has been called with \'%s\'' % text)
118
+
119
+ class Proxy:
120
+
121
+ def __init__(self, moduleName, className):
122
+
123
+ self.orgInst = getattr(__import__(moduleName, fromlist=[className]), className)()
124
+
125
+ def __getattr__(self, name):
126
+
127
+ attr = getattr(self.orgInst, name)
128
+
129
+ if(callable(attr)):
130
+
131
+ print('*redirecting method %s' % name)
132
+
133
+ # メソッドを呼び出す際の処理
134
+
135
+ else:
136
+
137
+ print('*redirecting property %s' % name)
138
+
139
+ # プロパティを取得する際の処理
140
+
141
+ return attr
142
+
143
+ def main():
144
+
145
+ inst = Proxy(splitext(basename(__file__))[0], 'Original')
146
+
147
+ print(inst.testProperty)
148
+
149
+ inst.testMethod('Hello')
150
+
151
+ inst.testMethod2('This invokation will be failed')
152
+
153
+ if(__name__ == '__main__'):main()
154
+
155
+ ```

5

pythonのコードを追記

2016/08/22 07:56

投稿

snowfaller
snowfaller

スコア125

test CHANGED
File without changes
test CHANGED
@@ -34,8 +34,6 @@
34
34
 
35
35
  ?>
36
36
 
37
-
38
-
39
37
  ```
40
38
 
41
39
  これらに該当するPythonの関数をご教授下さい。
@@ -61,3 +59,37 @@
61
59
  DBのConnectionクラスのProxy(代理人)クラスを作成する上で必要でした。
62
60
 
63
61
  PHPのマジックメソッドやPythonの特殊メソッドを使用すれば、Javaと比べて、(厳格性には欠けます)非常に、お手軽に実装出来ますね。
62
+
63
+
64
+
65
+ 【後記2】
66
+
67
+ ご回答頂いた内容をよく確認したところ、phpの```__call()```では、その延長で本来のメソッドを呼び出すのですが、pythonの```__getattr__()```はメソッドのオブジェクトを返す必要があるのですね(その後、pythonがそのメソッドを呼び出す)。
68
+
69
+ 先のphpのコードをpythonに焼きなおすと以下の通りになるかと。(双方共に細かいエラー処理は省略)
70
+
71
+ ```python
72
+
73
+ #!/usr/bin/env python3
74
+
75
+ class Test:
76
+
77
+ def dummy(self, *args):
78
+
79
+ None
80
+
81
+ def __getattr__(self, name):
82
+
83
+ print('Undefined function %s() has been called.' % name)
84
+
85
+ return self.dummy
86
+
87
+ def main():
88
+
89
+ inst = Test()
90
+
91
+ inst.undefinedTestMethod()
92
+
93
+ if(__name__ == '__main__'):main()
94
+
95
+ ```

4

結果の記入

2016/08/22 06:58

投稿

snowfaller
snowfaller

スコア125

test CHANGED
File without changes
test CHANGED
@@ -51,3 +51,13 @@
51
51
  → マジックメソッドの補足を追加してみました。
52
52
 
53
53
  → もうちょっと補足を追加してみました。
54
+
55
+
56
+
57
+ 【後記】
58
+
59
+ 皆様、ご回答ありがとうございました。
60
+
61
+ DBのConnectionクラスのProxy(代理人)クラスを作成する上で必要でした。
62
+
63
+ PHPのマジックメソッドやPythonの特殊メソッドを使用すれば、Javaと比べて、(厳格性には欠けます)非常に、お手軽に実装出来ますね。

3

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

2016/08/21 12:07

投稿

snowfaller
snowfaller

スコア125

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

2

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

2016/08/21 05:33

投稿

snowfaller
snowfaller

スコア125

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

1

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

2016/08/21 05:07

投稿

snowfaller
snowfaller

スコア125

test CHANGED
File without changes
test CHANGED
@@ -11,3 +11,7 @@
11
11
  に該当するPythonの関数をご教授下さい。
12
12
 
13
13
  前に一度実装したのですが、忘れてしまいました。
14
+
15
+
16
+
17
+ 「やってほしいことだけを記載した丸投げの質問」との指摘を受けましたが、これ以上どのように質問して良いのか正直分かりません。