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

回答編集履歴

4

__str__の説明を追加

2021/04/23 15:31

投稿

ppaul
ppaul

スコア24672

answer CHANGED
@@ -3,7 +3,7 @@
3
3
  ```python
4
4
  class Length(float):
5
5
  def to_cm(self):
6
- return super().__str__(self) + 'cm'
6
+ return super().__str__() + 'cm'
7
7
  ```
8
8
  ですね。
9
9
 
@@ -27,6 +27,17 @@
27
27
  Return str(self).
28
28
 
29
29
  という説明のように、そのオブジェクトの文字列化です。
30
+
31
+ >>> class Length(float):
32
+ ... def __str__(self):
33
+ ... return super().__str__() + 'cm'
34
+ ...
35
+ >>> pen = Length(16)
36
+ >>> print(pen)
37
+ 16.0cm
38
+
39
+ というように、__str__を定義すると、printは印字するときに文字列に変換するので
40
+ 上記のように印字します。
30
41
  ```
31
42
 
32
43
  - to_cm(self)のselfは、何をさしていますでしょうか?

3

問題点指摘

2021/04/23 15:31

投稿

ppaul
ppaul

スコア24672

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

2

説明追加

2021/04/23 15:25

投稿

ppaul
ppaul

スコア24672

answer CHANGED
@@ -6,11 +6,20 @@
6
6
 
7
7
  スペシャルメソッドのfloatというものはないと思います。
8
8
  floatというクラスのインスタンスを生成するときに、文字列とかint型のインスタンスを引数に与えることを言っているのでしょうか。
9
+ floatを関数だと誤解している人は結構いますが、[class float([x])](https://docs.python.org/ja/3/library/functions.html#float)を読むと、classと書いてあります。こういうものをコンストラクタと呼ぶこともあります。intとかstrとかもクラスです。
9
10
 
10
11
  - super()がついてますが、floatクラス内のstr()というスペシャルメソッドを呼び出して何をしているのでしょうか?
11
12
 
12
13
  文字列に変換しています。
14
+ ```explanation
15
+ __str__はそのオブジェクトの文字列表現を返すメソッドです。
13
16
 
17
+ >>> print((0.1).__str__.__doc__)
18
+ Return str(self).
19
+
20
+ という説明のように、そのオブジェクトの文字列化です。
21
+ ```
22
+
14
23
  - to_cm(self)のselfは、何をさしていますでしょうか?
15
24
 
16
25
  クラスを定義する時点ではインスタンスは存在していませんが、メソッドが呼び出される時点ではインスタンスが存在していますので、それを指しています。

1

説明の追加

2021/04/23 15:18

投稿

ppaul
ppaul

スコア24672

answer CHANGED
@@ -13,4 +13,18 @@
13
13
 
14
14
  - to_cm(self)のselfは、何をさしていますでしょうか?
15
15
 
16
- クラスを定義する時点ではインスタンスは存在していませんが、メソッドが呼び出される時点ではインスタンスが存在していますので、それを指しています。
16
+ クラスを定義する時点ではインスタンスは存在していませんが、メソッドが呼び出される時点ではインスタンスが存在していますので、それを指しています。
17
+
18
+ 以下のコードで考えてみてください。
19
+
20
+ ```python
21
+ >>> def print_mimic(x):
22
+ ... print(x)
23
+ ...
24
+ >>> x = 100
25
+ >>> print_mimic(x)
26
+ 100
27
+ ```
28
+ 関数print_mimicを定義した時点ではxはまだ定義されていません。
29
+ しかし、print_mimicを呼び出す時に定義されていれば問題なく動作します。
30
+ to_cmというメソッドの場合も同様に問題なく動作します。