回答編集履歴

2

サンプルコード追記

2015/10/24 03:49

投稿

shiena
shiena

スコア1825

test CHANGED
@@ -23,3 +23,129 @@
23
23
  `self.append(value)`にすると再帰呼び出しになり終了条件がないので無限ループになってしまいます。
24
24
 
25
25
  実際に実行すると再帰呼び出しの回数上限に引っかかりエラーになります。
26
+
27
+
28
+
29
+ ---
30
+
31
+
32
+
33
+ list.__init__()呼び出しの違いが分かるサンプルコード追記
34
+
35
+
36
+
37
+ ```
38
+
39
+ # -*- coding: utf-8 -*-
40
+
41
+
42
+
43
+ class TestExtends(list):
44
+
45
+
46
+
47
+ def __init__(self):
48
+
49
+ list.__init__(self)
50
+
51
+
52
+
53
+ def append(self,value):
54
+
55
+ list.append(self,value)
56
+
57
+ print u"値が追加されました:" + str(value)
58
+
59
+
60
+
61
+
62
+
63
+ if __name__ == "__main__":
64
+
65
+
66
+
67
+ test = TestExtends()
68
+
69
+ test.append("python")
70
+
71
+ test.append("-")
72
+
73
+ test.append("izm")
74
+
75
+
76
+
77
+ test.__init()
78
+
79
+ # list.__init__()を呼び出すとリストが初期化されます。
80
+
81
+ # passだと変化ありません。
82
+
83
+
84
+
85
+ print "==============="
86
+
87
+
88
+
89
+ for i in test:
90
+
91
+ print i
92
+
93
+ ```
94
+
95
+
96
+
97
+ ```
98
+
99
+ # -*- coding: utf-8 -*-
100
+
101
+
102
+
103
+ class TestMoreExtends(list):
104
+
105
+
106
+
107
+ def __init__(self, *args, **kw):
108
+
109
+ list.__init__(self, *args, **kw)
110
+
111
+
112
+
113
+ def append(self,value):
114
+
115
+ list.append(self,value)
116
+
117
+ print u"値が追加されました:" + str(value)
118
+
119
+
120
+
121
+
122
+
123
+ if __name__ == "__main__":
124
+
125
+
126
+
127
+ test = TestExtends([1, 2, 3])
128
+
129
+ # list.__init()を呼び出すとコンストラクタで初期値を設定できます。
130
+
131
+ # passだと初期値を設定できません。
132
+
133
+ test.append("python")
134
+
135
+ test.append("-")
136
+
137
+ test.append("izm")
138
+
139
+
140
+
141
+ print "==============="
142
+
143
+
144
+
145
+ for i in test:
146
+
147
+ print i
148
+
149
+ ```
150
+
151
+

1

説明間違いの訂正

2015/10/24 03:49

投稿

shiena
shiena

スコア1825

test CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  `test = TestExtends()`を実行してもlistの初期化と同等の処理が呼ばれません。
8
8
 
9
- ではどんな処理を行っているか?について、listは組込型なのでCのコードですが、[PyList_New(Py_ssize_tsize)](https://hg.python.org/cpython/file/tip/Objects/listobject.c#l113)が具体的な処理です。
9
+ ではどんな処理を行っているか?について、listは組込型なのでCのコードですが、[list_init(PyListObject *self, PyObject *args, PyObject *kw)](https://hg.python.org/cpython/file/tip/Objects/listobject.c#l2440)が具体的な処理です。
10
10
 
11
11
  ここで何をやっているのか詳細に知らなくても問題ありませんが、この処理が呼ばれないので動かないのも当然です。
12
12