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

回答編集履歴

1

インスタンス変数について追記

2017/07/05 16:17

投稿

miyahan
miyahan

スコア3095

answer CHANGED
@@ -10,4 +10,72 @@
10
10
  print(self.c)
11
11
  ```
12
12
 
13
- おそらく `TypeError: pri() takes 0 positional arguments but 1 was given` のようなエラーが出たと思いますが、引数が足りないというメッセージです。なにかエラーで止まった場合は、エラーメッセージを読む(英語がわからなければGoogle翻訳してみる)習慣をつけると理解が進みやすいと思います。
13
+ おそらく `TypeError: pri() takes 0 positional arguments but 1 was given` のようなエラーが出たと思いますが、引数が足りないというメッセージです。なにかエラーで止まった場合は、エラーメッセージを読む(英語がわからなければGoogle翻訳してみる)習慣をつけると理解が進みやすいと思います。
14
+
15
+ ---
16
+
17
+ 追記:
18
+
19
+ で本題ですが、`self.c = 10` で定義した変数cは **インスタンス変数** と呼ばれるものです。これはクラスのインスタンス内でのみアクセスできる変数です。
20
+
21
+ ```python
22
+ class Hoge(object):
23
+ def set_x(self, x):
24
+ self.x = x
25
+
26
+ def print_x(self):
27
+ print('self.x is ', self.x)
28
+
29
+
30
+ a = Hoge()
31
+ a.set_x(123)
32
+ a.print_x()
33
+
34
+ b = Hoge()
35
+ b.print_x()
36
+ ```
37
+
38
+ ```
39
+ # 実行結果
40
+ self.x is 123
41
+ Traceback (most recent call last):
42
+ File "hoge.py", line 14, in <module>
43
+ b.print_x()
44
+ File "hoge.py", line 6, in print_x
45
+ print('self.x is', self.x)
46
+ AttributeError: 'Hoge' object has no attribute 'x'
47
+ ```
48
+
49
+ ですので上記のように同じ Hoge クラスでも、別のインスタンスのインスタンス変数は見えません。
50
+
51
+ またもう少し広いスコープを持つ **クラス変数** というものがあります。
52
+
53
+ ```python
54
+ class Hoge(object):
55
+ y = 2017
56
+
57
+ def set_x(self, x):
58
+ self.x = x
59
+
60
+ def print_x(self):
61
+ print('self.x is', self.x)
62
+ print('self.y is', self.y)
63
+
64
+
65
+ print('Hoge.y is ', Hoge.y)
66
+
67
+ a = Hoge()
68
+ print('a.y is', a.y)
69
+ a.set_x(123)
70
+ a.print_x()
71
+ ```
72
+
73
+ ```
74
+ # 実行結果
75
+ Hoge.y is 2017
76
+ a.y is 2017
77
+ self.x is 123
78
+ self.y is 2017
79
+ ```
80
+
81
+ クラスをインスタンス化しなくても直接参照ができますし、各インスタンスの中からも参照可能です。ほかの言語でいう定数の変わりとして使うことが多いです。