回答編集履歴
12
修正
answer
CHANGED
@@ -49,7 +49,7 @@
|
|
49
49
|
関数の第1引数である名前`x`が、呼び出しの第1引数である4に束縛され、
|
50
50
|
関数の第2引数である名前`y`が、呼び出しの第2引数である8に束縛されます。
|
51
51
|
そののち本体が実行されます。
|
52
|
-
本体を実行している間は実行時の名前空間に名前`
|
52
|
+
本体を実行している間は実行時の名前空間に名前`x`と`y`が束縛されています。
|
53
53
|
ですから**定義からして**`x`と`y`はローカル変数です。
|
54
54
|
|
55
55
|
ここで、"引数"という言葉が2種類の対照的な意味で登場していました。
|
11
修正
answer
CHANGED
@@ -46,11 +46,11 @@
|
|
46
46
|
そのオブジェクトを"4と8という2つの引数を伴って呼び出す"という操作がおこなわれます。
|
47
47
|
関数オブジェクトの呼び出しがおこなわれると、
|
48
48
|
まず名前空間が作られ、
|
49
|
-
関数の第1引数である名前`
|
49
|
+
関数の第1引数である名前`x`が、呼び出しの第1引数である4に束縛され、
|
50
|
-
関数の第2引数である名前`
|
50
|
+
関数の第2引数である名前`y`が、呼び出しの第2引数である8に束縛されます。
|
51
51
|
そののち本体が実行されます。
|
52
52
|
本体を実行している間は実行時の名前空間に名前`a`と`b`が束縛されています。
|
53
|
-
ですから**定義からして**`
|
53
|
+
ですから**定義からして**`x`と`y`はローカル変数です。
|
54
54
|
|
55
55
|
ここで、"引数"という言葉が2種類の対照的な意味で登場していました。
|
56
56
|
紛らわしいので、
|
10
修正
answer
CHANGED
@@ -37,8 +37,8 @@
|
|
37
37
|
pass
|
38
38
|
```
|
39
39
|
と宣言すると、まず「引数が2つの関数オブジェクト」が作られます。そしてdef文が実行された名前空間で`a`という名前を束縛します(つまり、変数`a`に代入されるということです)。
|
40
|
+
この関数オブジェクトは2つの引数を受け取ります。
|
40
41
|
|
41
|
-
この関数オブジェクトは2つの引数を受け取ります。
|
42
42
|
関数が呼び出された時に作られる、関数の本体スイート(ブロックの中)を実行している時だけ存在する名前空間があります。
|
43
43
|
その名前空間に束縛される名前のことを[ローカル変数と呼んでいます](https://docs.python.org/ja/3/reference/executionmodel.html#index-6)。
|
44
44
|
|
@@ -54,7 +54,7 @@
|
|
54
54
|
|
55
55
|
ここで、"引数"という言葉が2種類の対照的な意味で登場していました。
|
56
56
|
紛らわしいので、
|
57
|
-
関数側の引数を[仮引数 とか parameter]((https://docs.python.org/ja/3/glossary.html#term-parameter)
|
57
|
+
関数側の引数を[仮引数 とか parameter]((https://docs.python.org/ja/3/glossary.html#term-parameter)と呼び、
|
58
58
|
呼び出し時に渡す引数を[実引数 とか argument](https://docs.python.org/ja/3/glossary.html#term-argument)と呼んで区別したりしますね。
|
59
59
|
|
60
60
|
----
|
@@ -116,12 +116,14 @@
|
|
116
116
|
@classmethod
|
117
117
|
def f(cls, i):
|
118
118
|
pass
|
119
|
+
|
120
|
+
x = C()
|
119
121
|
```
|
120
122
|
|
121
|
-
に対して`C.f(1)`と呼び出しするとき、
|
123
|
+
に対して`C.f(1)`や`x.f(1)`と呼び出しするとき、
|
122
|
-
その呼び出しは根底の関数オブジェクトを`f`とすると`f(C, 1)`の呼び出しと同じだと言っています。
|
124
|
+
その呼び出しは、根底の関数オブジェクトを`f`とすると`f(C, 1)`の呼び出しと同じだと言っています。
|
123
125
|
|
124
|
-
**関数の**第1引数である名前`cls`は、**メソッドの**呼び出し元である`C`に束縛され、
|
126
|
+
**関数の**第1引数である名前`cls`は、**メソッドの**呼び出し元(のクラス)である`C`に束縛され、
|
125
127
|
**関数の**第2引数である名前`i`は、**メソッドの**第1引数である`1`に束縛されます。
|
126
128
|
|
127
129
|
----
|
9
追記
answer
CHANGED
@@ -28,7 +28,37 @@
|
|
28
28
|
typeは[Python言語の組み込みクラス](https://docs.python.org/ja/3/library/functions.html#type)と同じ名前なので、慣習としてローカル変数名には使いません。
|
29
29
|
|
30
30
|
----
|
31
|
+
(追記2)
|
31
32
|
|
33
|
+
関数の話をします。
|
34
|
+
|
35
|
+
```python
|
36
|
+
def a(x, y):
|
37
|
+
pass
|
38
|
+
```
|
39
|
+
と宣言すると、まず「引数が2つの関数オブジェクト」が作られます。そしてdef文が実行された名前空間で`a`という名前を束縛します(つまり、変数`a`に代入されるということです)。
|
40
|
+
|
41
|
+
この関数オブジェクトは2つの引数を受け取ります。
|
42
|
+
関数が呼び出された時に作られる、関数の本体スイート(ブロックの中)を実行している時だけ存在する名前空間があります。
|
43
|
+
その名前空間に束縛される名前のことを[ローカル変数と呼んでいます](https://docs.python.org/ja/3/reference/executionmodel.html#index-6)。
|
44
|
+
|
45
|
+
関数を`a(4, 8)`というコードを実行すると、名前`a`が解決されてオブジェクトが取り出されます(それは関数オブジェクトでした)。
|
46
|
+
そのオブジェクトを"4と8という2つの引数を伴って呼び出す"という操作がおこなわれます。
|
47
|
+
関数オブジェクトの呼び出しがおこなわれると、
|
48
|
+
まず名前空間が作られ、
|
49
|
+
関数の第1引数である名前`a`が、呼び出しの第1引数である4に束縛され、
|
50
|
+
関数の第2引数である名前`b`が、呼び出しの第2引数である8に束縛されます。
|
51
|
+
そののち本体が実行されます。
|
52
|
+
本体を実行している間は実行時の名前空間に名前`a`と`b`が束縛されています。
|
53
|
+
ですから**定義からして**`a`と`b`はローカル変数です。
|
54
|
+
|
55
|
+
ここで、"引数"という言葉が2種類の対照的な意味で登場していました。
|
56
|
+
紛らわしいので、
|
57
|
+
関数側の引数を[仮引数 とか parameter]((https://docs.python.org/ja/3/glossary.html#term-parameter))と呼び、
|
58
|
+
呼び出し時に渡す引数を[実引数 とか argument](https://docs.python.org/ja/3/glossary.html#term-argument)と呼んで区別したりしますね。
|
59
|
+
|
60
|
+
----
|
61
|
+
|
32
62
|
(追記)
|
33
63
|
|
34
64
|
メソッドの話をします。
|
@@ -36,15 +66,22 @@
|
|
36
66
|
公式ドキュメントのこのあたりです。
|
37
67
|
[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)
|
38
68
|
|
69
|
+
ちょっと読み進めたところに
|
70
|
+
|
39
71
|
> インスタンスメソッドオブジェクトが呼び出される際、根底にある関数 (`__func__`) が呼び出されます。このとき、クラスインスタンス (`__self__`) が引数リストの先頭に挿入されます。例えば、 `C` を関数 `f()` の定義を含むクラス、 `x` を `C` のインスタンスとすると、 `x.f(1)` の呼び出しは `C.f(x, 1)` の呼び出しと同じです。
|
40
72
|
|
41
73
|
|
74
|
+
とでてきます。
|
75
|
+
|
42
76
|
```python
|
43
77
|
class C:
|
44
78
|
def f(self, i):
|
45
79
|
pass
|
46
80
|
```
|
81
|
+
とすると、class文の本体スイートが実行されクラスオブジェクトが作られます。
|
82
|
+
そしてclass文が実行された名前空間で`C`という名前を束縛します(つまり、変数`C`に代入されるということです)。
|
47
|
-
|
83
|
+
クラスオブジェクトが作られた時にその`f`という属性は、def文で作成された「引数が2つの関数オブジェクト」に束縛されています。
|
84
|
+
`C.f`と参照すると「引数が2つの関数オブジェクト」を指しているというわけです。
|
48
85
|
|
49
86
|
```python
|
50
87
|
x = C()
|
@@ -55,14 +92,14 @@
|
|
55
92
|
```
|
56
93
|
と呼び出すとき、その呼び出しは`C.f(x, 1)`の呼び出しと同じだと言っています。
|
57
94
|
|
58
|
-
実は`x.f`は、def文で生成された(`C.f`で参照できる)関数
|
95
|
+
実は、`x.f`は、def文で生成された(`C.f`で参照できる)関数とは別のオブジェクトに束縛されています。
|
59
|
-
インスタンスメソッドオブジェクトなるものに束縛されているとなっています。
|
60
|
-
そのインスタンスメソッドオブジェクトを`(1)`という引数で呼び出すと
|
96
|
+
インスタンスメソッドオブジェクトなるものに束縛されていると説明されていて、そのインスタンスメソッドオブジェクトを`(1)`という引数で呼び出すと**その中で**`C.f(x, 1)`の呼び出しがおこなわれるわけです。
|
61
97
|
(そのような機能を持っているオブジェクトに対して、"インスタンスメソッドオブジェクト"という名前を付けた、という理解でもいいかもしれません)
|
62
98
|
|
63
99
|
前述の通り、`C.f`は`def f(self, i): pass`で作成された関数オブジェクトでした。
|
100
|
+
`C.f(x, 1)`の呼び出しがおこなわれるということは、
|
64
|
-
**その関数の**第1引数である名前`self`は、**メソッドの
|
101
|
+
**その関数の**第1引数である名前`self`は、**メソッドの呼び出し元**である`x`に束縛され、
|
65
|
-
**その関数の**第2引数である名前`i`は、**メソッドの**第1引数である`1`に束縛されます。
|
102
|
+
**その関数の**第2引数である名前`i`は、**メソッド呼び出しの**第1引数である`1`に束縛されます。
|
66
103
|
|
67
104
|
「selfには自分自身が入る」などとよく説明されますが、その機構は上記のようになっています。
|
68
105
|
|
@@ -84,7 +121,7 @@
|
|
84
121
|
に対して`C.f(1)`と呼び出しするとき、
|
85
122
|
その呼び出しは根底の関数オブジェクトを`f`とすると`f(C, 1)`の呼び出しと同じだと言っています。
|
86
123
|
|
87
|
-
**関数の**第1引数である名前`cls`は、**メソッドの**呼び出し元である`C`に束縛され
|
124
|
+
**関数の**第1引数である名前`cls`は、**メソッドの**呼び出し元である`C`に束縛され、
|
88
125
|
**関数の**第2引数である名前`i`は、**メソッドの**第1引数である`1`に束縛されます。
|
89
126
|
|
90
127
|
----
|
8
追記
answer
CHANGED
@@ -53,11 +53,16 @@
|
|
53
53
|
```python
|
54
54
|
x.f(1)
|
55
55
|
```
|
56
|
-
と呼び出すと、その呼び出しは`C.f(x, 1)`の呼び出しと同じだと言っています。
|
56
|
+
と呼び出すとき、その呼び出しは`C.f(x, 1)`の呼び出しと同じだと言っています。
|
57
57
|
|
58
|
+
実は`x.f`は、def文で生成された(`C.f`で参照できる)関数をに束縛されているのではありません。
|
59
|
+
インスタンスメソッドオブジェクトなるものに束縛されているとなっています。
|
60
|
+
そのインスタンスメソッドオブジェクトを`(1)`という引数で呼び出すと、その中で`C.f(x, 1)`の呼び出しがおこなわれるのです。
|
61
|
+
(そのような機能を持っているオブジェクトに対して、"インスタンスメソッドオブジェクト"という名前を付けた、という理解でもいいかもしれません)
|
62
|
+
|
58
63
|
前述の通り、`C.f`は`def f(self, i): pass`で作成された関数オブジェクトでした。
|
59
|
-
**関数の**第1引数である名前`self`は、**メソッドの**呼び出し元である`x`に束縛されます。
|
64
|
+
**その関数の**第1引数である名前`self`は、**メソッドの**呼び出し元である`x`に束縛されます。
|
60
|
-
**関数の**第2引数である名前`i`は、**メソッドの**第1引数である`1`に束縛されます。
|
65
|
+
**その関数の**第2引数である名前`i`は、**メソッドの**第1引数である`1`に束縛されます。
|
61
66
|
|
62
67
|
「selfには自分自身が入る」などとよく説明されますが、その機構は上記のようになっています。
|
63
68
|
|
7
追記
answer
CHANGED
@@ -90,4 +90,4 @@
|
|
90
90
|
|
91
91
|
> このメソッドは特別扱いされているので、明示的に静的メソッドと宣言する必要はありません
|
92
92
|
|
93
|
-
と記載されている通り、明に書かなくても静的なクラスメソッドとして扱われることになっています。
|
93
|
+
と記載されている通り、`__new__`は明に書かなくても静的なメソッド(≒クラスメソッド)として扱われることになっています。
|
6
間違えました
answer
CHANGED
@@ -77,8 +77,7 @@
|
|
77
77
|
```
|
78
78
|
|
79
79
|
に対して`C.f(1)`と呼び出しするとき、
|
80
|
-
`x.f`はインスタンスメソッドオブジェクトなるオブジェクトであると言っています。
|
81
|
-
|
80
|
+
その呼び出しは根底の関数オブジェクトを`f`とすると`f(C, 1)`の呼び出しと同じだと言っています。
|
82
81
|
|
83
82
|
**関数の**第1引数である名前`cls`は、**メソッドの**呼び出し元である`C`に束縛されます。
|
84
83
|
**関数の**第2引数である名前`i`は、**メソッドの**第1引数である`1`に束縛されます。
|
5
追記
answer
CHANGED
@@ -25,4 +25,70 @@
|
|
25
25
|
|
26
26
|
> とりわけ、typeとobjectは、いつ利用するかが気になっています。
|
27
27
|
|
28
|
-
typeは[Python言語の組み込みクラス](https://docs.python.org/ja/3/library/functions.html#type)と同じ名前なので、慣習としてローカル変数名には使いません。
|
28
|
+
typeは[Python言語の組み込みクラス](https://docs.python.org/ja/3/library/functions.html#type)と同じ名前なので、慣習としてローカル変数名には使いません。
|
29
|
+
|
30
|
+
----
|
31
|
+
|
32
|
+
(追記)
|
33
|
+
|
34
|
+
メソッドの話をします。
|
35
|
+
|
36
|
+
公式ドキュメントのこのあたりです。
|
37
|
+
[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)
|
38
|
+
|
39
|
+
> インスタンスメソッドオブジェクトが呼び出される際、根底にある関数 (`__func__`) が呼び出されます。このとき、クラスインスタンス (`__self__`) が引数リストの先頭に挿入されます。例えば、 `C` を関数 `f()` の定義を含むクラス、 `x` を `C` のインスタンスとすると、 `x.f(1)` の呼び出しは `C.f(x, 1)` の呼び出しと同じです。
|
40
|
+
|
41
|
+
|
42
|
+
```python
|
43
|
+
class C:
|
44
|
+
def f(self, i):
|
45
|
+
pass
|
46
|
+
```
|
47
|
+
と定義すると、`C.f`という属性には、def文で作成された「引数が2つの関数オブジェクト」が束縛されます。
|
48
|
+
|
49
|
+
```python
|
50
|
+
x = C()
|
51
|
+
```
|
52
|
+
とインスタンス化して、
|
53
|
+
```python
|
54
|
+
x.f(1)
|
55
|
+
```
|
56
|
+
と呼び出すと、その呼び出しは`C.f(x, 1)`の呼び出しと同じだと言っています。
|
57
|
+
|
58
|
+
前述の通り、`C.f`は`def f(self, i): pass`で作成された関数オブジェクトでした。
|
59
|
+
**関数の**第1引数である名前`self`は、**メソッドの**呼び出し元である`x`に束縛されます。
|
60
|
+
**関数の**第2引数である名前`i`は、**メソッドの**第1引数である`1`に束縛されます。
|
61
|
+
|
62
|
+
「selfには自分自身が入る」などとよく説明されますが、その機構は上記のようになっています。
|
63
|
+
|
64
|
+
----
|
65
|
+
|
66
|
+
続けて
|
67
|
+
|
68
|
+
> クラスメソッドオブジェクトからインスタンスメソッドオブジェクトが導出される際、 `__self__` に記憶されている "クラスインスタンス" は実際はクラスそのものなので、 `x.f(1)` や `C.f(1)` の呼び出しは、根底にある関数を `f` として `f(C,1)` の呼び出しと等価です。
|
69
|
+
|
70
|
+
と書いてあります。
|
71
|
+
|
72
|
+
```python
|
73
|
+
class C:
|
74
|
+
@classmethod
|
75
|
+
def f(cls, i):
|
76
|
+
pass
|
77
|
+
```
|
78
|
+
|
79
|
+
に対して`C.f(1)`と呼び出しするとき、
|
80
|
+
`x.f`はインスタンスメソッドオブジェクトなるオブジェクトであると言っています。
|
81
|
+
また、その呼び出しは`根底の関数オブジェクト(C, 1)`の呼び出しと同じだと言っています。
|
82
|
+
|
83
|
+
**関数の**第1引数である名前`cls`は、**メソッドの**呼び出し元である`C`に束縛されます。
|
84
|
+
**関数の**第2引数である名前`i`は、**メソッドの**第1引数である`1`に束縛されます。
|
85
|
+
|
86
|
+
----
|
87
|
+
|
88
|
+
[https://docs.python.org/ja/3/reference/datamodel.html#object.__new__](https://docs.python.org/ja/3/reference/datamodel.html#object.__new__)
|
89
|
+
|
90
|
+
に
|
91
|
+
|
92
|
+
> このメソッドは特別扱いされているので、明示的に静的メソッドと宣言する必要はありません
|
93
|
+
|
94
|
+
と記載されている通り、明に書かなくても静的なクラスメソッドとして扱われることになっています。
|
4
追記
answer
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
class A(B):
|
3
3
|
pass
|
4
4
|
```
|
5
|
-
class文の引数は**親クラスの指定**に使います。
|
5
|
+
class文の引数は**親クラスの指定**に使います。↑は「AはBを継承する」という宣言です。
|
6
6
|
|
7
7
|
|
8
8
|
関数の引数は呼び出し元からの値に名前を束縛するのに使います。要するに**ローカル変数**です。
|
3
リンク追加
answer
CHANGED
@@ -25,4 +25,4 @@
|
|
25
25
|
|
26
26
|
> とりわけ、typeとobjectは、いつ利用するかが気になっています。
|
27
27
|
|
28
|
-
typeはPython言語の組み込みクラスと同じ名前なので、慣習としてローカル変数名には使いません。
|
28
|
+
typeは[Python言語の組み込みクラス](https://docs.python.org/ja/3/library/functions.html#type)と同じ名前なので、慣習としてローカル変数名には使いません。
|
2
修正
answer
CHANGED
@@ -25,4 +25,4 @@
|
|
25
25
|
|
26
26
|
> とりわけ、typeとobjectは、いつ利用するかが気になっています。
|
27
27
|
|
28
|
-
typeは
|
28
|
+
typeはPython言語の組み込みクラスと同じ名前なので、慣習としてローカル変数名には使いません。
|
1
些細
answer
CHANGED
@@ -25,4 +25,4 @@
|
|
25
25
|
|
26
26
|
> とりわけ、typeとobjectは、いつ利用するかが気になっています。
|
27
27
|
|
28
|
-
typeは標準の関数
|
28
|
+
typeは標準ライブラリの関数(実装上はクラス)と同じ名前なので、慣習としてローカル変数名には使いません。
|