質問編集履歴
6
スケルトンコードの追記
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のコードを追記
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
結果の記入
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
もうちょっと補足を追加してみました。
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
マジックメソッドの補足を追加してみました。
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
「やってほしいことだけを記載した丸投げの質問」との指摘を受けましたが、これ以上どのように質問して良いのか正直分かりません。
title
CHANGED
File without changes
|
body
CHANGED
@@ -4,4 +4,6 @@
|
|
4
4
|
__set()
|
5
5
|
```
|
6
6
|
に該当するPythonの関数をご教授下さい。
|
7
|
-
前に一度実装したのですが、忘れてしまいました。
|
7
|
+
前に一度実装したのですが、忘れてしまいました。
|
8
|
+
|
9
|
+
「やってほしいことだけを記載した丸投げの質問」との指摘を受けましたが、これ以上どのように質問して良いのか正直分かりません。
|