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