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

回答編集履歴

3

Add second answer

2020/09/09 13:55

投稿

y_shinoda
y_shinoda

スコア3272

answer CHANGED
@@ -1,5 +1,7 @@
1
- ## 質問1
1
+ ## 元の回答
2
2
 
3
+ ### 質問1
4
+
3
5
  > 何故 data の方は 初期化しないか理解できません。
4
6
  > 何故ここでは name のみを初期化しているのでしょうか。
5
7
 
@@ -20,7 +22,7 @@
20
22
 
21
23
  設計としては `data` もアトリビュートとして持たせる設計の方が良いかもしれません
22
24
 
23
- ## 質問2
25
+ ### 質問2
24
26
 
25
27
  > みなさんは自分でクラスを作成する際、
26
28
  > どういった判断基準で、初期化する/しないを分けているのでしょうか。
@@ -98,4 +100,68 @@
98
100
  ```
99
101
 
100
102
  これは、クラスが点数を`状態`としてを持ったので、
101
- クラスの外で変数として`状態`を持つ必要がなくなったためです
103
+ クラスの外で変数として`状態`を持つ必要がなくなったためです
104
+
105
+ ## 追記
106
+
107
+ > アトリビュート定義(状態を持たせる)のと、初期化せず、外で変数を持たせるかどうかは、
108
+ > 実装する機能の仕様に合わせて、
109
+ > ソースコードがより簡潔に短くなる方をアトリビュートとして採用すべき、ということでしょうか。
110
+
111
+ 回答者によって見解が分かれるかもしれませんが、個人的には、ほぼ、その認識でよいと思います
112
+
113
+ 設計としてはアトリビュートを定義する方が正しい場合でも、
114
+ ごくまれにですが、余計にコードが煩雑になる場合もあります
115
+ そのような場合はソースコードが簡潔に短くなる方の設計を採用することもあります
116
+
117
+ > 「インスタンスごとに、アトリビュートを定義する必要がある」
118
+ > との説明があったのですが、今回の場合、
119
+ > name と data のいずれかをアトリビュートとして定義しないと、
120
+ > そもそもインスタンス化ができない、という理解であってますでしょうか。
121
+
122
+ コンストラクターの定義によります
123
+
124
+ 今回のコードはコンストラクター内でアトリビュートを定義しています
125
+ しかし、そのコンストラクターに、アトリビュートの値として使われる引数を渡さなかった場合、
126
+ コンストラクターの呼び出しでエラーが発生します
127
+
128
+ 例えば次のような場合はインスタンス化できずエラーとなります:
129
+
130
+ ```python
131
+ class Student:
132
+
133
+ def __init__(self, name):
134
+ self.name = name
135
+
136
+ a001 = Student()
137
+ print(a001.name)
138
+ ```
139
+
140
+ 実行結果:
141
+
142
+ ```console
143
+ $ python test.py
144
+ Traceback (most recent call last):
145
+ File "test.py", line 6, in <module>
146
+ a001 = Student()
147
+ TypeError: __init__() missing 1 required positional argument: 'name'
148
+ ```
149
+
150
+ 次のように、コンストラクターの引数に初期値を定義しておくと、エラーは発生しません:
151
+
152
+ ```python
153
+ class Student:
154
+
155
+ def __init__(self, name="Taro"):
156
+ self.name = name
157
+
158
+ a001 = Student()
159
+ print(a001.name)
160
+ ```
161
+
162
+ 実行結果:
163
+
164
+ ```console
165
+ python test.py
166
+ Taro
167
+ ```

2

Add expression

2020/09/09 13:55

投稿

y_shinoda
y_shinoda

スコア3272

answer CHANGED
@@ -3,6 +3,9 @@
3
3
  > 何故 data の方は 初期化しないか理解できません。
4
4
  > 何故ここでは name のみを初期化しているのでしょうか。
5
5
 
6
+ 質問のコードの引用元:
7
+ [(159) Python超入門コース 合併版|Pythonの超基本的な部分をたった1時間で学べます【プログラミング初心者向け入門講座】 - YouTube](https://www.youtube.com/watch?v=HyU3XL2F9GE)
8
+
6
9
  ざっと見た感じ特に理由は述べられていなかったので
7
10
  製作者のみ知るところですが、
8
11
  予想としては、これは「`超入門コース`」であるためと思われます
@@ -15,7 +18,7 @@
15
18
  ここでは設計が洗練されていることを犠牲にしてでも
16
19
  引数を与えることができることを教える`意図`があったのではないかと思われます
17
20
 
18
- 設計としては data もアトリビュートとして持たせる設計の方が良いかもしれません
21
+ 設計としては `data` もアトリビュートとして持たせる設計の方が良いかもしれません
19
22
 
20
23
  ## 質問2
21
24
 

1

Add expression

2020/08/18 13:51

投稿

y_shinoda
y_shinoda

スコア3272

answer CHANGED
@@ -19,6 +19,9 @@
19
19
 
20
20
  ## 質問2
21
21
 
22
+ > みなさんは自分でクラスを作成する際、
23
+ > どういった判断基準で、初期化する/しないを分けているのでしょうか。
24
+
22
25
  `状態`を持つ必要があるかどうかで判断します
23
26
 
24
27
  初期化というか、アトリビュートを定義するということは、`状態`を持つということです