回答編集履歴

1

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

2017/07/05 16:17

投稿

miyahan
miyahan

スコア3095

test CHANGED
@@ -23,3 +23,139 @@
23
23
 
24
24
 
25
25
  おそらく `TypeError: pri() takes 0 positional arguments but 1 was given` のようなエラーが出たと思いますが、引数が足りないというメッセージです。なにかエラーで止まった場合は、エラーメッセージを読む(英語がわからなければGoogle翻訳してみる)習慣をつけると理解が進みやすいと思います。
26
+
27
+
28
+
29
+ ---
30
+
31
+
32
+
33
+ 追記:
34
+
35
+
36
+
37
+ で本題ですが、`self.c = 10` で定義した変数cは **インスタンス変数** と呼ばれるものです。これはクラスのインスタンス内でのみアクセスできる変数です。
38
+
39
+
40
+
41
+ ```python
42
+
43
+ class Hoge(object):
44
+
45
+ def set_x(self, x):
46
+
47
+ self.x = x
48
+
49
+
50
+
51
+ def print_x(self):
52
+
53
+ print('self.x is ', self.x)
54
+
55
+
56
+
57
+
58
+
59
+ a = Hoge()
60
+
61
+ a.set_x(123)
62
+
63
+ a.print_x()
64
+
65
+
66
+
67
+ b = Hoge()
68
+
69
+ b.print_x()
70
+
71
+ ```
72
+
73
+
74
+
75
+ ```
76
+
77
+ # 実行結果
78
+
79
+ self.x is 123
80
+
81
+ Traceback (most recent call last):
82
+
83
+ File "hoge.py", line 14, in <module>
84
+
85
+ b.print_x()
86
+
87
+ File "hoge.py", line 6, in print_x
88
+
89
+ print('self.x is', self.x)
90
+
91
+ AttributeError: 'Hoge' object has no attribute 'x'
92
+
93
+ ```
94
+
95
+
96
+
97
+ ですので上記のように同じ Hoge クラスでも、別のインスタンスのインスタンス変数は見えません。
98
+
99
+
100
+
101
+ またもう少し広いスコープを持つ **クラス変数** というものがあります。
102
+
103
+
104
+
105
+ ```python
106
+
107
+ class Hoge(object):
108
+
109
+ y = 2017
110
+
111
+
112
+
113
+ def set_x(self, x):
114
+
115
+ self.x = x
116
+
117
+
118
+
119
+ def print_x(self):
120
+
121
+ print('self.x is', self.x)
122
+
123
+ print('self.y is', self.y)
124
+
125
+
126
+
127
+
128
+
129
+ print('Hoge.y is ', Hoge.y)
130
+
131
+
132
+
133
+ a = Hoge()
134
+
135
+ print('a.y is', a.y)
136
+
137
+ a.set_x(123)
138
+
139
+ a.print_x()
140
+
141
+ ```
142
+
143
+
144
+
145
+ ```
146
+
147
+ # 実行結果
148
+
149
+ Hoge.y is 2017
150
+
151
+ a.y is 2017
152
+
153
+ self.x is 123
154
+
155
+ self.y is 2017
156
+
157
+ ```
158
+
159
+
160
+
161
+ クラスをインスタンス化しなくても直接参照ができますし、各インスタンスの中からも参照可能です。ほかの言語でいう定数の変わりとして使うことが多いです。