回答編集履歴

12

修正

2021/04/24 08:35

投稿

quickquip
quickquip

スコア11044

test CHANGED
@@ -100,7 +100,7 @@
100
100
 
101
101
  そののち本体が実行されます。
102
102
 
103
- 本体を実行している間は実行時の名前空間に名前`a`と`b`が束縛されています。
103
+ 本体を実行している間は実行時の名前空間に名前`x`と`y`が束縛されています。
104
104
 
105
105
  ですから**定義からして**`x`と`y`はローカル変数です。
106
106
 

11

修正

2021/04/24 08:35

投稿

quickquip
quickquip

スコア11044

test CHANGED
@@ -94,15 +94,15 @@
94
94
 
95
95
  まず名前空間が作られ、
96
96
 
97
- 関数の第1引数である名前`a`が、呼び出しの第1引数である4に束縛され、
97
+ 関数の第1引数である名前`x`が、呼び出しの第1引数である4に束縛され、
98
-
98
+
99
- 関数の第2引数である名前`b`が、呼び出しの第2引数である8に束縛されます。
99
+ 関数の第2引数である名前`y`が、呼び出しの第2引数である8に束縛されます。
100
100
 
101
101
  そののち本体が実行されます。
102
102
 
103
103
  本体を実行している間は実行時の名前空間に名前`a`と`b`が束縛されています。
104
104
 
105
- ですから**定義からして**`a`と`b`はローカル変数です。
105
+ ですから**定義からして**`x`と`y`はローカル変数です。
106
106
 
107
107
 
108
108
 

10

修正

2021/04/24 08:33

投稿

quickquip
quickquip

スコア11044

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

追記

2021/04/24 00:49

投稿

quickquip
quickquip

スコア11044

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
- と定義すると、`C.f`という属性は、def文で作成された「引数が2つの関数オブジェクト」束縛されます。
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)`という引数で呼び出すとその中で`C.f(x, 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`は、**メソッドの**呼び出し元である`x`に束縛されます。
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

追記

2021/04/24 00:42

投稿

quickquip
quickquip

スコア11044

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

追記

2021/04/23 16:44

投稿

quickquip
quickquip

スコア11044

test CHANGED
@@ -182,4 +182,4 @@
182
182
 
183
183
 
184
184
 
185
- と記載されている通り、明に書かなくても静的なクラスメソッドとして扱われることになっています。
185
+ と記載されている通り、`__new__`は明に書かなくても静的なメソッド(≒クラスメソッドとして扱われることになっています。

6

間違えました

2021/04/23 16:12

投稿

quickquip
quickquip

スコア11044

test CHANGED
@@ -156,9 +156,7 @@
156
156
 
157
157
  に対して`C.f(1)`と呼び出しするとき、
158
158
 
159
- `x.f`はインスタンスメソッドオブジェクトなるオブジェクトであると言っています。
160
-
161
- また、その呼び出しは`根底の関数オブジェクト(C, 1)`の呼び出しと同じだと言っています。
159
+ その呼び出しは根底の関数オブジェクトを`f`とすると`f(C, 1)`の呼び出しと同じだと言っています。
162
160
 
163
161
 
164
162
 

5

追記

2021/04/23 16:11

投稿

quickquip
quickquip

スコア11044

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

追記

2021/04/23 16:00

投稿

quickquip
quickquip

スコア11044

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

リンク追加

2021/04/22 06:49

投稿

quickquip
quickquip

スコア11044

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

修正

2021/04/22 06:23

投稿

quickquip
quickquip

スコア11044

test CHANGED
@@ -52,4 +52,4 @@
52
52
 
53
53
 
54
54
 
55
- typeは標準ライブラリ関数(実装上はクラスと同じ名前なので、慣習としてローカル変数名には使いません。
55
+ typeはPython言語組み込みクラスと同じ名前なので、慣習としてローカル変数名には使いません。

1

些細

2021/04/22 06:22

投稿

quickquip
quickquip

スコア11044

test CHANGED
@@ -52,4 +52,4 @@
52
52
 
53
53
 
54
54
 
55
- typeは標準の関数と同じなので、慣習としてローカル変数名には使いません。
55
+ typeは標準ライブラリの関数(実装上はクラス)と同じ名前なので、慣習としてローカル変数名には使いません。