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

回答編集履歴

2

サンプルコード追記

2015/10/24 03:49

投稿

shiena
shiena

スコア1827

answer CHANGED
@@ -10,4 +10,66 @@
10
10
  - 追加処理→`print u"値が追加されました:" + str(value)`
11
11
 
12
12
  `self.append(value)`にすると再帰呼び出しになり終了条件がないので無限ループになってしまいます。
13
- 実際に実行すると再帰呼び出しの回数上限に引っかかりエラーになります。
13
+ 実際に実行すると再帰呼び出しの回数上限に引っかかりエラーになります。
14
+
15
+ ---
16
+
17
+ list.__init__()呼び出しの違いが分かるサンプルコード追記
18
+
19
+ ```
20
+ # -*- coding: utf-8 -*-
21
+
22
+ class TestExtends(list):
23
+
24
+ def __init__(self):
25
+ list.__init__(self)
26
+
27
+ def append(self,value):
28
+ list.append(self,value)
29
+ print u"値が追加されました:" + str(value)
30
+
31
+
32
+ if __name__ == "__main__":
33
+
34
+ test = TestExtends()
35
+ test.append("python")
36
+ test.append("-")
37
+ test.append("izm")
38
+
39
+ test.__init()
40
+ # list.__init__()を呼び出すとリストが初期化されます。
41
+ # passだと変化ありません。
42
+
43
+ print "==============="
44
+
45
+ for i in test:
46
+ print i
47
+ ```
48
+
49
+ ```
50
+ # -*- coding: utf-8 -*-
51
+
52
+ class TestMoreExtends(list):
53
+
54
+ def __init__(self, *args, **kw):
55
+ list.__init__(self, *args, **kw)
56
+
57
+ def append(self,value):
58
+ list.append(self,value)
59
+ print u"値が追加されました:" + str(value)
60
+
61
+
62
+ if __name__ == "__main__":
63
+
64
+ test = TestExtends([1, 2, 3])
65
+ # list.__init()を呼び出すとコンストラクタで初期値を設定できます。
66
+ # passだと初期値を設定できません。
67
+ test.append("python")
68
+ test.append("-")
69
+ test.append("izm")
70
+
71
+ print "==============="
72
+
73
+ for i in test:
74
+ print i
75
+ ```

1

説明間違いの訂正

2015/10/24 03:49

投稿

shiena
shiena

スコア1827

answer CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  1つ目の初期化メソッドを呼び出さないとどうなるか?
4
4
  `test = TestExtends()`を実行してもlistの初期化と同等の処理が呼ばれません。
5
- ではどんな処理を行っているか?について、listは組込型なのでCのコードですが、[PyList_New(Py_ssize_tsize)](https://hg.python.org/cpython/file/tip/Objects/listobject.c#l113)が具体的な処理です。
5
+ ではどんな処理を行っているか?について、listは組込型なのでCのコードですが、[list_init(PyListObject *self, PyObject *args, PyObject *kw)](https://hg.python.org/cpython/file/tip/Objects/listobject.c#l2440)が具体的な処理です。
6
6
  ここで何をやっているのか詳細に知らなくても問題ありませんが、この処理が呼ばれないので動かないのも当然です。
7
7
 
8
8
  2つ目のappend()メソッドについて、機能を拡張するとはどういう事かというと「元の処理+追加処理」に他なりません。