回答編集履歴
12
修正
test
CHANGED
@@ -100,7 +100,7 @@
|
|
100
100
|
|
101
101
|
そののち本体が実行されます。
|
102
102
|
|
103
|
-
本体を実行している間は実行時の名前空間に名前`
|
103
|
+
本体を実行している間は実行時の名前空間に名前`x`と`y`が束縛されています。
|
104
104
|
|
105
105
|
ですから**定義からして**`x`と`y`はローカル変数です。
|
106
106
|
|
11
修正
test
CHANGED
@@ -94,15 +94,15 @@
|
|
94
94
|
|
95
95
|
まず名前空間が作られ、
|
96
96
|
|
97
|
-
関数の第1引数である名前`
|
97
|
+
関数の第1引数である名前`x`が、呼び出しの第1引数である4に束縛され、
|
98
|
-
|
98
|
+
|
99
|
-
関数の第2引数である名前`
|
99
|
+
関数の第2引数である名前`y`が、呼び出しの第2引数である8に束縛されます。
|
100
100
|
|
101
101
|
そののち本体が実行されます。
|
102
102
|
|
103
103
|
本体を実行している間は実行時の名前空間に名前`a`と`b`が束縛されています。
|
104
104
|
|
105
|
-
ですから**定義からして**`
|
105
|
+
ですから**定義からして**`x`と`y`はローカル変数です。
|
106
106
|
|
107
107
|
|
108
108
|
|
10
修正
test
CHANGED
@@ -76,10 +76,10 @@
|
|
76
76
|
|
77
77
|
と宣言すると、まず「引数が2つの関数オブジェクト」が作られます。そしてdef文が実行された名前空間で`a`という名前を束縛します(つまり、変数`a`に代入されるということです)。
|
78
78
|
|
79
|
-
|
80
|
-
|
81
79
|
この関数オブジェクトは2つの引数を受け取ります。
|
82
80
|
|
81
|
+
|
82
|
+
|
83
83
|
関数が呼び出された時に作られる、関数の本体スイート(ブロックの中)を実行している時だけ存在する名前空間があります。
|
84
84
|
|
85
85
|
その名前空間に束縛される名前のことを[ローカル変数と呼んでいます](https://docs.python.org/ja/3/reference/executionmodel.html#index-6)。
|
@@ -110,7 +110,7 @@
|
|
110
110
|
|
111
111
|
紛らわしいので、
|
112
112
|
|
113
|
-
関数側の引数を[仮引数 とか parameter]((https://docs.python.org/ja/3/glossary.html#term-parameter)
|
113
|
+
関数側の引数を[仮引数 とか parameter]((https://docs.python.org/ja/3/glossary.html#term-parameter)と呼び、
|
114
114
|
|
115
115
|
呼び出し時に渡す引数を[実引数 とか argument](https://docs.python.org/ja/3/glossary.html#term-argument)と呼んで区別したりしますね。
|
116
116
|
|
@@ -234,17 +234,21 @@
|
|
234
234
|
|
235
235
|
pass
|
236
236
|
|
237
|
+
|
238
|
+
|
239
|
+
x = C()
|
240
|
+
|
237
|
-
```
|
241
|
+
```
|
238
|
-
|
239
|
-
|
240
|
-
|
242
|
+
|
243
|
+
|
244
|
+
|
241
|
-
に対して`C.f(1)`と呼び出しするとき、
|
245
|
+
に対して`C.f(1)`や`x.f(1)`と呼び出しするとき、
|
242
|
-
|
246
|
+
|
243
|
-
その呼び出しは根底の関数オブジェクトを`f`とすると`f(C, 1)`の呼び出しと同じだと言っています。
|
247
|
+
その呼び出しは、根底の関数オブジェクトを`f`とすると`f(C, 1)`の呼び出しと同じだと言っています。
|
244
|
-
|
245
|
-
|
246
|
-
|
248
|
+
|
249
|
+
|
250
|
+
|
247
|
-
**関数の**第1引数である名前`cls`は、**メソッドの**呼び出し元である`C`に束縛され、
|
251
|
+
**関数の**第1引数である名前`cls`は、**メソッドの**呼び出し元(のクラス)である`C`に束縛され、
|
248
252
|
|
249
253
|
**関数の**第2引数である名前`i`は、**メソッドの**第1引数である`1`に束縛されます。
|
250
254
|
|
9
追記
test
CHANGED
@@ -58,6 +58,66 @@
|
|
58
58
|
|
59
59
|
----
|
60
60
|
|
61
|
+
(追記2)
|
62
|
+
|
63
|
+
|
64
|
+
|
65
|
+
関数の話をします。
|
66
|
+
|
67
|
+
|
68
|
+
|
69
|
+
```python
|
70
|
+
|
71
|
+
def a(x, y):
|
72
|
+
|
73
|
+
pass
|
74
|
+
|
75
|
+
```
|
76
|
+
|
77
|
+
と宣言すると、まず「引数が2つの関数オブジェクト」が作られます。そしてdef文が実行された名前空間で`a`という名前を束縛します(つまり、変数`a`に代入されるということです)。
|
78
|
+
|
79
|
+
|
80
|
+
|
81
|
+
この関数オブジェクトは2つの引数を受け取ります。
|
82
|
+
|
83
|
+
関数が呼び出された時に作られる、関数の本体スイート(ブロックの中)を実行している時だけ存在する名前空間があります。
|
84
|
+
|
85
|
+
その名前空間に束縛される名前のことを[ローカル変数と呼んでいます](https://docs.python.org/ja/3/reference/executionmodel.html#index-6)。
|
86
|
+
|
87
|
+
|
88
|
+
|
89
|
+
関数を`a(4, 8)`というコードを実行すると、名前`a`が解決されてオブジェクトが取り出されます(それは関数オブジェクトでした)。
|
90
|
+
|
91
|
+
そのオブジェクトを"4と8という2つの引数を伴って呼び出す"という操作がおこなわれます。
|
92
|
+
|
93
|
+
関数オブジェクトの呼び出しがおこなわれると、
|
94
|
+
|
95
|
+
まず名前空間が作られ、
|
96
|
+
|
97
|
+
関数の第1引数である名前`a`が、呼び出しの第1引数である4に束縛され、
|
98
|
+
|
99
|
+
関数の第2引数である名前`b`が、呼び出しの第2引数である8に束縛されます。
|
100
|
+
|
101
|
+
そののち本体が実行されます。
|
102
|
+
|
103
|
+
本体を実行している間は実行時の名前空間に名前`a`と`b`が束縛されています。
|
104
|
+
|
105
|
+
ですから**定義からして**`a`と`b`はローカル変数です。
|
106
|
+
|
107
|
+
|
108
|
+
|
109
|
+
ここで、"引数"という言葉が2種類の対照的な意味で登場していました。
|
110
|
+
|
111
|
+
紛らわしいので、
|
112
|
+
|
113
|
+
関数側の引数を[仮引数 とか parameter]((https://docs.python.org/ja/3/glossary.html#term-parameter))と呼び、
|
114
|
+
|
115
|
+
呼び出し時に渡す引数を[実引数 とか argument](https://docs.python.org/ja/3/glossary.html#term-argument)と呼んで区別したりしますね。
|
116
|
+
|
117
|
+
|
118
|
+
|
119
|
+
----
|
120
|
+
|
61
121
|
|
62
122
|
|
63
123
|
(追記)
|
@@ -74,12 +134,20 @@
|
|
74
134
|
|
75
135
|
|
76
136
|
|
137
|
+
ちょっと読み進めたところに
|
138
|
+
|
139
|
+
|
140
|
+
|
77
141
|
> インスタンスメソッドオブジェクトが呼び出される際、根底にある関数 (`__func__`) が呼び出されます。このとき、クラスインスタンス (`__self__`) が引数リストの先頭に挿入されます。例えば、 `C` を関数 `f()` の定義を含むクラス、 `x` を `C` のインスタンスとすると、 `x.f(1)` の呼び出しは `C.f(x, 1)` の呼び出しと同じです。
|
78
142
|
|
79
143
|
|
80
144
|
|
81
145
|
|
82
146
|
|
147
|
+
とでてきます。
|
148
|
+
|
149
|
+
|
150
|
+
|
83
151
|
```python
|
84
152
|
|
85
153
|
class C:
|
@@ -90,7 +158,13 @@
|
|
90
158
|
|
91
159
|
```
|
92
160
|
|
161
|
+
とすると、class文の本体スイートが実行されクラスオブジェクトが作られます。
|
162
|
+
|
163
|
+
そしてclass文が実行された名前空間で`C`という名前を束縛します(つまり、変数`C`に代入されるということです)。
|
164
|
+
|
93
|
-
|
165
|
+
クラスオブジェクトが作られた時にその`f`という属性は、def文で作成された「引数が2つの関数オブジェクト」に束縛されています。
|
166
|
+
|
167
|
+
`C.f`と参照すると「引数が2つの関数オブジェクト」を指しているというわけです。
|
94
168
|
|
95
169
|
|
96
170
|
|
@@ -112,11 +186,9 @@
|
|
112
186
|
|
113
187
|
|
114
188
|
|
115
|
-
実は`x.f`は、def文で生成された(`C.f`で参照できる)関数
|
189
|
+
実は、`x.f`は、def文で生成された(`C.f`で参照できる)関数とは別のオブジェクトに束縛されています。
|
116
|
-
|
117
|
-
|
190
|
+
|
118
|
-
|
119
|
-
そのインスタンスメソッドオブジェクトを`(1)`という引数で呼び出すと
|
191
|
+
インスタンスメソッドオブジェクトなるものに束縛されていると説明されていて、そのインスタンスメソッドオブジェクトを`(1)`という引数で呼び出すと**その中で**`C.f(x, 1)`の呼び出しがおこなわれるわけです。
|
120
192
|
|
121
193
|
(そのような機能を持っているオブジェクトに対して、"インスタンスメソッドオブジェクト"という名前を付けた、という理解でもいいかもしれません)
|
122
194
|
|
@@ -124,9 +196,11 @@
|
|
124
196
|
|
125
197
|
前述の通り、`C.f`は`def f(self, i): pass`で作成された関数オブジェクトでした。
|
126
198
|
|
199
|
+
`C.f(x, 1)`の呼び出しがおこなわれるということは、
|
200
|
+
|
127
|
-
**その関数の**第1引数である名前`self`は、**メソッドの
|
201
|
+
**その関数の**第1引数である名前`self`は、**メソッドの呼び出し元**である`x`に束縛され、
|
128
|
-
|
202
|
+
|
129
|
-
**その関数の**第2引数である名前`i`は、**メソッドの**第1引数である`1`に束縛されます。
|
203
|
+
**その関数の**第2引数である名前`i`は、**メソッド呼び出しの**第1引数である`1`に束縛されます。
|
130
204
|
|
131
205
|
|
132
206
|
|
@@ -170,7 +244,7 @@
|
|
170
244
|
|
171
245
|
|
172
246
|
|
173
|
-
**関数の**第1引数である名前`cls`は、**メソッドの**呼び出し元である`C`に束縛され
|
247
|
+
**関数の**第1引数である名前`cls`は、**メソッドの**呼び出し元である`C`に束縛され、
|
174
248
|
|
175
249
|
**関数の**第2引数である名前`i`は、**メソッドの**第1引数である`1`に束縛されます。
|
176
250
|
|
8
追記
test
CHANGED
@@ -108,15 +108,25 @@
|
|
108
108
|
|
109
109
|
```
|
110
110
|
|
111
|
-
と呼び出すと、その呼び出しは`C.f(x, 1)`の呼び出しと同じだと言っています。
|
111
|
+
と呼び出すとき、その呼び出しは`C.f(x, 1)`の呼び出しと同じだと言っています。
|
112
|
+
|
113
|
+
|
114
|
+
|
115
|
+
実は`x.f`は、def文で生成された(`C.f`で参照できる)関数をに束縛されているのではありません。
|
116
|
+
|
117
|
+
インスタンスメソッドオブジェクトなるものに束縛されているとなっています。
|
118
|
+
|
119
|
+
そのインスタンスメソッドオブジェクトを`(1)`という引数で呼び出すと、その中で`C.f(x, 1)`の呼び出しがおこなわれるのです。
|
120
|
+
|
121
|
+
(そのような機能を持っているオブジェクトに対して、"インスタンスメソッドオブジェクト"という名前を付けた、という理解でもいいかもしれません)
|
112
122
|
|
113
123
|
|
114
124
|
|
115
125
|
前述の通り、`C.f`は`def f(self, i): pass`で作成された関数オブジェクトでした。
|
116
126
|
|
117
|
-
**関数の**第1引数である名前`self`は、**メソッドの**呼び出し元である`x`に束縛されます。
|
127
|
+
**その関数の**第1引数である名前`self`は、**メソッドの**呼び出し元である`x`に束縛されます。
|
118
128
|
|
119
|
-
**関数の**第2引数である名前`i`は、**メソッドの**第1引数である`1`に束縛されます。
|
129
|
+
**その関数の**第2引数である名前`i`は、**メソッドの**第1引数である`1`に束縛されます。
|
120
130
|
|
121
131
|
|
122
132
|
|
7
追記
test
CHANGED
@@ -182,4 +182,4 @@
|
|
182
182
|
|
183
183
|
|
184
184
|
|
185
|
-
と記載されている通り、明に書かなくても静的なクラスメソッドとして扱われることになっています。
|
185
|
+
と記載されている通り、`__new__`は明に書かなくても静的なメソッド(≒クラスメソッド)として扱われることになっています。
|
6
間違えました
test
CHANGED
@@ -156,9 +156,7 @@
|
|
156
156
|
|
157
157
|
に対して`C.f(1)`と呼び出しするとき、
|
158
158
|
|
159
|
-
`x.f`はインスタンスメソッドオブジェクトなるオブジェクトであると言っています。
|
160
|
-
|
161
|
-
|
159
|
+
その呼び出しは根底の関数オブジェクトを`f`とすると`f(C, 1)`の呼び出しと同じだと言っています。
|
162
160
|
|
163
161
|
|
164
162
|
|
5
追記
test
CHANGED
@@ -53,3 +53,135 @@
|
|
53
53
|
|
54
54
|
|
55
55
|
typeは[Python言語の組み込みクラス](https://docs.python.org/ja/3/library/functions.html#type)と同じ名前なので、慣習としてローカル変数名には使いません。
|
56
|
+
|
57
|
+
|
58
|
+
|
59
|
+
----
|
60
|
+
|
61
|
+
|
62
|
+
|
63
|
+
(追記)
|
64
|
+
|
65
|
+
|
66
|
+
|
67
|
+
メソッドの話をします。
|
68
|
+
|
69
|
+
|
70
|
+
|
71
|
+
公式ドキュメントのこのあたりです。
|
72
|
+
|
73
|
+
[https://docs.python.org/ja/3/reference/datamodel.html?highlight=__new__#index-36](https://docs.python.org/ja/3/reference/datamodel.html?highlight=__new__#index-36)
|
74
|
+
|
75
|
+
|
76
|
+
|
77
|
+
> インスタンスメソッドオブジェクトが呼び出される際、根底にある関数 (`__func__`) が呼び出されます。このとき、クラスインスタンス (`__self__`) が引数リストの先頭に挿入されます。例えば、 `C` を関数 `f()` の定義を含むクラス、 `x` を `C` のインスタンスとすると、 `x.f(1)` の呼び出しは `C.f(x, 1)` の呼び出しと同じです。
|
78
|
+
|
79
|
+
|
80
|
+
|
81
|
+
|
82
|
+
|
83
|
+
```python
|
84
|
+
|
85
|
+
class C:
|
86
|
+
|
87
|
+
def f(self, i):
|
88
|
+
|
89
|
+
pass
|
90
|
+
|
91
|
+
```
|
92
|
+
|
93
|
+
と定義すると、`C.f`という属性には、def文で作成された「引数が2つの関数オブジェクト」が束縛されます。
|
94
|
+
|
95
|
+
|
96
|
+
|
97
|
+
```python
|
98
|
+
|
99
|
+
x = C()
|
100
|
+
|
101
|
+
```
|
102
|
+
|
103
|
+
とインスタンス化して、
|
104
|
+
|
105
|
+
```python
|
106
|
+
|
107
|
+
x.f(1)
|
108
|
+
|
109
|
+
```
|
110
|
+
|
111
|
+
と呼び出すと、その呼び出しは`C.f(x, 1)`の呼び出しと同じだと言っています。
|
112
|
+
|
113
|
+
|
114
|
+
|
115
|
+
前述の通り、`C.f`は`def f(self, i): pass`で作成された関数オブジェクトでした。
|
116
|
+
|
117
|
+
**関数の**第1引数である名前`self`は、**メソッドの**呼び出し元である`x`に束縛されます。
|
118
|
+
|
119
|
+
**関数の**第2引数である名前`i`は、**メソッドの**第1引数である`1`に束縛されます。
|
120
|
+
|
121
|
+
|
122
|
+
|
123
|
+
「selfには自分自身が入る」などとよく説明されますが、その機構は上記のようになっています。
|
124
|
+
|
125
|
+
|
126
|
+
|
127
|
+
----
|
128
|
+
|
129
|
+
|
130
|
+
|
131
|
+
続けて
|
132
|
+
|
133
|
+
|
134
|
+
|
135
|
+
> クラスメソッドオブジェクトからインスタンスメソッドオブジェクトが導出される際、 `__self__` に記憶されている "クラスインスタンス" は実際はクラスそのものなので、 `x.f(1)` や `C.f(1)` の呼び出しは、根底にある関数を `f` として `f(C,1)` の呼び出しと等価です。
|
136
|
+
|
137
|
+
|
138
|
+
|
139
|
+
と書いてあります。
|
140
|
+
|
141
|
+
|
142
|
+
|
143
|
+
```python
|
144
|
+
|
145
|
+
class C:
|
146
|
+
|
147
|
+
@classmethod
|
148
|
+
|
149
|
+
def f(cls, i):
|
150
|
+
|
151
|
+
pass
|
152
|
+
|
153
|
+
```
|
154
|
+
|
155
|
+
|
156
|
+
|
157
|
+
に対して`C.f(1)`と呼び出しするとき、
|
158
|
+
|
159
|
+
`x.f`はインスタンスメソッドオブジェクトなるオブジェクトであると言っています。
|
160
|
+
|
161
|
+
また、その呼び出しは`根底の関数オブジェクト(C, 1)`の呼び出しと同じだと言っています。
|
162
|
+
|
163
|
+
|
164
|
+
|
165
|
+
**関数の**第1引数である名前`cls`は、**メソッドの**呼び出し元である`C`に束縛されます。
|
166
|
+
|
167
|
+
**関数の**第2引数である名前`i`は、**メソッドの**第1引数である`1`に束縛されます。
|
168
|
+
|
169
|
+
|
170
|
+
|
171
|
+
----
|
172
|
+
|
173
|
+
|
174
|
+
|
175
|
+
[https://docs.python.org/ja/3/reference/datamodel.html#object.__new__](https://docs.python.org/ja/3/reference/datamodel.html#object.__new__)
|
176
|
+
|
177
|
+
|
178
|
+
|
179
|
+
に
|
180
|
+
|
181
|
+
|
182
|
+
|
183
|
+
> このメソッドは特別扱いされているので、明示的に静的メソッドと宣言する必要はありません
|
184
|
+
|
185
|
+
|
186
|
+
|
187
|
+
と記載されている通り、明に書かなくても静的なクラスメソッドとして扱われることになっています。
|
4
追記
test
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
|
7
7
|
```
|
8
8
|
|
9
|
-
class文の引数は**親クラスの指定**に使います。
|
9
|
+
class文の引数は**親クラスの指定**に使います。↑は「AはBを継承する」という宣言です。
|
10
10
|
|
11
11
|
|
12
12
|
|
3
リンク追加
test
CHANGED
@@ -52,4 +52,4 @@
|
|
52
52
|
|
53
53
|
|
54
54
|
|
55
|
-
typeはPython言語の組み込みクラスと同じ名前なので、慣習としてローカル変数名には使いません。
|
55
|
+
typeは[Python言語の組み込みクラス](https://docs.python.org/ja/3/library/functions.html#type)と同じ名前なので、慣習としてローカル変数名には使いません。
|
2
修正
test
CHANGED
@@ -52,4 +52,4 @@
|
|
52
52
|
|
53
53
|
|
54
54
|
|
55
|
-
typeは
|
55
|
+
typeはPython言語の組み込みクラスと同じ名前なので、慣習としてローカル変数名には使いません。
|
1
些細
test
CHANGED
@@ -52,4 +52,4 @@
|
|
52
52
|
|
53
53
|
|
54
54
|
|
55
|
-
typeは標準の関数
|
55
|
+
typeは標準ライブラリの関数(実装上はクラス)と同じ名前なので、慣習としてローカル変数名には使いません。
|