回答編集履歴

4

__str__の説明を追加

2021/04/23 15:31

投稿

ppaul
ppaul

スコア24666

test CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  def to_cm(self):
10
10
 
11
- return super().__str__(self) + 'cm'
11
+ return super().__str__() + 'cm'
12
12
 
13
13
  ```
14
14
 
@@ -56,6 +56,28 @@
56
56
 
57
57
  という説明のように、そのオブジェクトの文字列化です。
58
58
 
59
+
60
+
61
+ >>> class Length(float):
62
+
63
+ ... def __str__(self):
64
+
65
+ ... return super().__str__() + 'cm'
66
+
67
+ ...
68
+
69
+ >>> pen = Length(16)
70
+
71
+ >>> print(pen)
72
+
73
+ 16.0cm
74
+
75
+
76
+
77
+ というように、__str__を定義すると、printは印字するときに文字列に変換するので
78
+
79
+ 上記のように印字します。
80
+
59
81
  ```
60
82
 
61
83
 

3

問題点指摘

2021/04/23 15:31

投稿

ppaul
ppaul

スコア24666

test CHANGED
@@ -1,3 +1,21 @@
1
+ 確認したところ、コードに誤りがあるようです。
2
+
3
+
4
+
5
+ ```python
6
+
7
+ class Length(float):
8
+
9
+ def to_cm(self):
10
+
11
+ return super().__str__(self) + 'cm'
12
+
13
+ ```
14
+
15
+ ですね。
16
+
17
+
18
+
1
19
  - 上記のコードだと、floatクラスが継承されているんでしょうか?
2
20
 
3
21
 

2

説明追加

2021/04/23 15:25

投稿

ppaul
ppaul

スコア24666

test CHANGED
@@ -14,6 +14,8 @@
14
14
 
15
15
  floatというクラスのインスタンスを生成するときに、文字列とかint型のインスタンスを引数に与えることを言っているのでしょうか。
16
16
 
17
+ floatを関数だと誤解している人は結構いますが、[class float([x])](https://docs.python.org/ja/3/library/functions.html#float)を読むと、classと書いてあります。こういうものをコンストラクタと呼ぶこともあります。intとかstrとかもクラスです。
18
+
17
19
 
18
20
 
19
21
  - super()がついてますが、floatクラス内のstr()というスペシャルメソッドを呼び出して何をしているのでしょうか?
@@ -21,6 +23,22 @@
21
23
 
22
24
 
23
25
  文字列に変換しています。
26
+
27
+ ```explanation
28
+
29
+ __str__はそのオブジェクトの文字列表現を返すメソッドです。
30
+
31
+
32
+
33
+ >>> print((0.1).__str__.__doc__)
34
+
35
+ Return str(self).
36
+
37
+
38
+
39
+ という説明のように、そのオブジェクトの文字列化です。
40
+
41
+ ```
24
42
 
25
43
 
26
44
 

1

説明の追加

2021/04/23 15:18

投稿

ppaul
ppaul

スコア24666

test CHANGED
@@ -29,3 +29,31 @@
29
29
 
30
30
 
31
31
  クラスを定義する時点ではインスタンスは存在していませんが、メソッドが呼び出される時点ではインスタンスが存在していますので、それを指しています。
32
+
33
+
34
+
35
+ 以下のコードで考えてみてください。
36
+
37
+
38
+
39
+ ```python
40
+
41
+ >>> def print_mimic(x):
42
+
43
+ ... print(x)
44
+
45
+ ...
46
+
47
+ >>> x = 100
48
+
49
+ >>> print_mimic(x)
50
+
51
+ 100
52
+
53
+ ```
54
+
55
+ 関数print_mimicを定義した時点ではxはまだ定義されていません。
56
+
57
+ しかし、print_mimicを呼び出す時に定義されていれば問題なく動作します。
58
+
59
+ to_cmというメソッドの場合も同様に問題なく動作します。