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

回答編集履歴

12

修正

2021/04/24 08:35

投稿

quickquip
quickquip

スコア11314

answer CHANGED
@@ -49,7 +49,7 @@
49
49
  関数の第1引数である名前`x`が、呼び出しの第1引数である4に束縛され、
50
50
  関数の第2引数である名前`y`が、呼び出しの第2引数である8に束縛されます。
51
51
  そののち本体が実行されます。
52
- 本体を実行している間は実行時の名前空間に名前`a`と`b`が束縛されています。
52
+ 本体を実行している間は実行時の名前空間に名前`x`と`y`が束縛されています。
53
53
  ですから**定義からして**`x`と`y`はローカル変数です。
54
54
 
55
55
  ここで、"引数"という言葉が2種類の対照的な意味で登場していました。

11

修正

2021/04/24 08:35

投稿

quickquip
quickquip

スコア11314

answer CHANGED
@@ -46,11 +46,11 @@
46
46
  そのオブジェクトを"4と8という2つの引数を伴って呼び出す"という操作がおこなわれます。
47
47
  関数オブジェクトの呼び出しがおこなわれると、
48
48
  まず名前空間が作られ、
49
- 関数の第1引数である名前`a`が、呼び出しの第1引数である4に束縛され、
49
+ 関数の第1引数である名前`x`が、呼び出しの第1引数である4に束縛され、
50
- 関数の第2引数である名前`b`が、呼び出しの第2引数である8に束縛されます。
50
+ 関数の第2引数である名前`y`が、呼び出しの第2引数である8に束縛されます。
51
51
  そののち本体が実行されます。
52
52
  本体を実行している間は実行時の名前空間に名前`a`と`b`が束縛されています。
53
- ですから**定義からして**`a`と`b`はローカル変数です。
53
+ ですから**定義からして**`x`と`y`はローカル変数です。
54
54
 
55
55
  ここで、"引数"という言葉が2種類の対照的な意味で登場していました。
56
56
  紛らわしいので、

10

修正

2021/04/24 08:33

投稿

quickquip
quickquip

スコア11314

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

追記

2021/04/24 00:49

投稿

quickquip
quickquip

スコア11314

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

追記

2021/04/24 00:42

投稿

quickquip
quickquip

スコア11314

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

追記

2021/04/23 16:44

投稿

quickquip
quickquip

スコア11314

answer CHANGED
@@ -90,4 +90,4 @@
90
90
 
91
91
  > このメソッドは特別扱いされているので、明示的に静的メソッドと宣言する必要はありません
92
92
 
93
- と記載されている通り、明に書かなくても静的なクラスメソッドとして扱われることになっています。
93
+ と記載されている通り、`__new__`は明に書かなくても静的なメソッド(≒クラスメソッドとして扱われることになっています。

6

間違えました

2021/04/23 16:12

投稿

quickquip
quickquip

スコア11314

answer CHANGED
@@ -77,8 +77,7 @@
77
77
  ```
78
78
 
79
79
  に対して`C.f(1)`と呼び出しするとき、
80
- `x.f`はインスタンスメソッドオブジェクトなるオブジェクトであると言っています。
81
- また、その呼び出しは`根底の関数オブジェクト(C, 1)`の呼び出しと同じだと言っています。
80
+ その呼び出しは根底の関数オブジェクトを`f`とすると`f(C, 1)`の呼び出しと同じだと言っています。
82
81
 
83
82
  **関数の**第1引数である名前`cls`は、**メソッドの**呼び出し元である`C`に束縛されます。
84
83
  **関数の**第2引数である名前`i`は、**メソッドの**第1引数である`1`に束縛されます。

5

追記

2021/04/23 16:11

投稿

quickquip
quickquip

スコア11314

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

追記

2021/04/23 16:00

投稿

quickquip
quickquip

スコア11314

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

リンク追加

2021/04/22 06:49

投稿

quickquip
quickquip

スコア11314

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

修正

2021/04/22 06:23

投稿

quickquip
quickquip

スコア11314

answer CHANGED
@@ -25,4 +25,4 @@
25
25
 
26
26
  > とりわけ、typeとobjectは、いつ利用するかが気になっています。
27
27
 
28
- typeは標準ライブラリ関数(実装上はクラスと同じ名前なので、慣習としてローカル変数名には使いません。
28
+ typeはPython言語組み込みクラスと同じ名前なので、慣習としてローカル変数名には使いません。

1

些細

2021/04/22 06:22

投稿

quickquip
quickquip

スコア11314

answer CHANGED
@@ -25,4 +25,4 @@
25
25
 
26
26
  > とりわけ、typeとobjectは、いつ利用するかが気になっています。
27
27
 
28
- typeは標準の関数と同じなので、慣習としてローカル変数名には使いません。
28
+ typeは標準ライブラリの関数(実装上はクラス)と同じ名前なので、慣習としてローカル変数名には使いません。