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

回答編集履歴

1

追記

2017/11/23 10:03

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -1,5 +1,4 @@
1
1
  こうですね。
2
- インスタンス変数とローカル変数について調べた方が良いかと思います。
3
2
  ```Python
4
3
  class teratail():
5
4
  def __init__(self):
@@ -7,4 +6,96 @@
7
6
 
8
7
  def B(self):
9
8
  print(self.hoge)
10
- ```
9
+ ```
10
+
11
+ 確認
12
+ ---
13
+ **ローカル変数とは**
14
+ メソッドや関数内の普通の変数は**ローカル変数**といって、基本的に外部から参照できません。
15
+ ```Python
16
+ >>> def hoge():
17
+ ... a = 'hogehoge'
18
+ ...
19
+ >>> hoge()
20
+ >>> print(a)
21
+ Traceback (most recent call last):
22
+ File "<stdin>", line 1, in <module>
23
+ NameError: name 'a' is not defined
24
+ ```
25
+
26
+ 関数から値を返したい場合は、基本的にはreturnする必要があります。
27
+ ただし、この場合もやっぱりローカル変数自体は外部から参照できません。
28
+ ```Python
29
+ >>> def hoge():
30
+ ... a = 'hogehoge'
31
+ ... return a
32
+ ...
33
+ >>> ret = hoge()
34
+ >>> print(ret)
35
+ hogehoge
36
+ >>> print(a)
37
+ Traceback (most recent call last):
38
+ File "<stdin>", line 1, in <module>
39
+ NameError: name 'a' is not defined
40
+ ```
41
+
42
+ ---
43
+ **インスタンス変数とは**
44
+ クラスのインスタンス内で参照できる変数です。
45
+ `__init__`メソッド内で`self.変数名`という風に宣言します。
46
+
47
+ 誤解してそうなところ
48
+ ---
49
+ **メソッドの宣言の仕方**
50
+ Pythonでは、メソッドの第一引数がインスタンスになります。
51
+ ですので、次のコードは呼び出すことができません。
52
+ ```Python
53
+ >>> class teratail():
54
+ ... def A():
55
+ ... hoge = "渡したい"
56
+ ...
57
+ >>> t = teratail()
58
+ >>> t.A()
59
+ Traceback (most recent call last):
60
+ File "<stdin>", line 1, in <module>
61
+ TypeError: A() takes 0 positional arguments but 1 was given
62
+ ```
63
+
64
+ 基本的に第一引数名は`self`にします。文字通り、自分自身と言う意味です。
65
+ ```Python
66
+ >>> class teratail():
67
+ ... def A(self):
68
+ ... hoge = "渡したい"
69
+ ...
70
+ >>> t = teratail()
71
+ >>> t.A()
72
+ >>>
73
+ ```
74
+
75
+ ---
76
+ **クラスの使い方**
77
+ 基本的には、インスタンスを用います。
78
+ `クラス名.メソッド名`とか、`クラス名.変数名`という使い方はどちらかと言うと特殊です。
79
+ ```Python
80
+ >>> class teratail():
81
+ ... def A(self):
82
+ ... hoge = "渡したい"
83
+ ...
84
+ >>> teratail.A()
85
+ Traceback (most recent call last):
86
+ File "<stdin>", line 1, in <module>
87
+ TypeError: A() missing 1 required positional argument: 'self'
88
+ ```
89
+
90
+ 今後の方針
91
+ ---
92
+ > def Bでgethoge =teratail.A()としても
93
+
94
+ というのは、いろいろと意味不明な使い方です。
95
+ クラスの使い方も、関数もメソッドもおそらくわかっていません。
96
+ - Aの第一引数がない
97
+ - Aはクラスメソッド/スタティックメソッドではない
98
+ - Aが値を返していない
99
+ - なぜ変数名が動詞なのか
100
+
101
+ 変数や関数の使い方など、もっと基礎的なところを見直した方がよいです。