回答編集履歴

1

追記

2017/11/23 10:03

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -1,7 +1,5 @@
1
1
  こうですね。
2
2
 
3
- インスタンス変数とローカル変数について調べた方が良いかと思います。
4
-
5
3
  ```Python
6
4
 
7
5
  class teratail():
@@ -17,3 +15,187 @@
17
15
  print(self.hoge)
18
16
 
19
17
  ```
18
+
19
+
20
+
21
+ 確認
22
+
23
+ ---
24
+
25
+ **ローカル変数とは**
26
+
27
+ メソッドや関数内の普通の変数は**ローカル変数**といって、基本的に外部から参照できません。
28
+
29
+ ```Python
30
+
31
+ >>> def hoge():
32
+
33
+ ... a = 'hogehoge'
34
+
35
+ ...
36
+
37
+ >>> hoge()
38
+
39
+ >>> print(a)
40
+
41
+ Traceback (most recent call last):
42
+
43
+ File "<stdin>", line 1, in <module>
44
+
45
+ NameError: name 'a' is not defined
46
+
47
+ ```
48
+
49
+
50
+
51
+ 関数から値を返したい場合は、基本的にはreturnする必要があります。
52
+
53
+ ただし、この場合もやっぱりローカル変数自体は外部から参照できません。
54
+
55
+ ```Python
56
+
57
+ >>> def hoge():
58
+
59
+ ... a = 'hogehoge'
60
+
61
+ ... return a
62
+
63
+ ...
64
+
65
+ >>> ret = hoge()
66
+
67
+ >>> print(ret)
68
+
69
+ hogehoge
70
+
71
+ >>> print(a)
72
+
73
+ Traceback (most recent call last):
74
+
75
+ File "<stdin>", line 1, in <module>
76
+
77
+ NameError: name 'a' is not defined
78
+
79
+ ```
80
+
81
+
82
+
83
+ ---
84
+
85
+ **インスタンス変数とは**
86
+
87
+ クラスのインスタンス内で参照できる変数です。
88
+
89
+ `__init__`メソッド内で`self.変数名`という風に宣言します。
90
+
91
+
92
+
93
+ 誤解してそうなところ
94
+
95
+ ---
96
+
97
+ **メソッドの宣言の仕方**
98
+
99
+ Pythonでは、メソッドの第一引数がインスタンスになります。
100
+
101
+ ですので、次のコードは呼び出すことができません。
102
+
103
+ ```Python
104
+
105
+ >>> class teratail():
106
+
107
+ ... def A():
108
+
109
+ ... hoge = "渡したい"
110
+
111
+ ...
112
+
113
+ >>> t = teratail()
114
+
115
+ >>> t.A()
116
+
117
+ Traceback (most recent call last):
118
+
119
+ File "<stdin>", line 1, in <module>
120
+
121
+ TypeError: A() takes 0 positional arguments but 1 was given
122
+
123
+ ```
124
+
125
+
126
+
127
+ 基本的に第一引数名は`self`にします。文字通り、自分自身と言う意味です。
128
+
129
+ ```Python
130
+
131
+ >>> class teratail():
132
+
133
+ ... def A(self):
134
+
135
+ ... hoge = "渡したい"
136
+
137
+ ...
138
+
139
+ >>> t = teratail()
140
+
141
+ >>> t.A()
142
+
143
+ >>>
144
+
145
+ ```
146
+
147
+
148
+
149
+ ---
150
+
151
+ **クラスの使い方**
152
+
153
+ 基本的には、インスタンスを用います。
154
+
155
+ `クラス名.メソッド名`とか、`クラス名.変数名`という使い方はどちらかと言うと特殊です。
156
+
157
+ ```Python
158
+
159
+ >>> class teratail():
160
+
161
+ ... def A(self):
162
+
163
+ ... hoge = "渡したい"
164
+
165
+ ...
166
+
167
+ >>> teratail.A()
168
+
169
+ Traceback (most recent call last):
170
+
171
+ File "<stdin>", line 1, in <module>
172
+
173
+ TypeError: A() missing 1 required positional argument: 'self'
174
+
175
+ ```
176
+
177
+
178
+
179
+ 今後の方針
180
+
181
+ ---
182
+
183
+ > def Bでgethoge =teratail.A()としても
184
+
185
+
186
+
187
+ というのは、いろいろと意味不明な使い方です。
188
+
189
+ クラスの使い方も、関数もメソッドもおそらくわかっていません。
190
+
191
+ - Aの第一引数がない
192
+
193
+ - Aはクラスメソッド/スタティックメソッドではない
194
+
195
+ - Aが値を返していない
196
+
197
+ - なぜ変数名が動詞なのか
198
+
199
+
200
+
201
+ 変数や関数の使い方など、もっと基礎的なところを見直した方がよいです。