回答編集履歴
3
誤記
answer
CHANGED
@@ -43,7 +43,7 @@
|
|
43
43
|
決して「基底クラスの派生クラスでないものを無理やり派生クラスに改変する」ようなものではありません。全然目的が違うのです。
|
44
44
|
|
45
45
|
---
|
46
|
-
|
46
|
+
補足: ~~結論を言い忘れました。~~(じゃなくて...)C#のasをそのまままねするなら次のようにすべきと思います。
|
47
47
|
|
48
48
|
```Python
|
49
49
|
a = some_function() # AまたはAの派生のBのインスタンスを返すような関数
|
2
追記
answer
CHANGED
@@ -40,4 +40,13 @@
|
|
40
40
|
|
41
41
|
「ある基底クラスに属するインスタンスが、そのクラスの特定の派生クラスのインスタンスであるかどうかを検査し、そうであるなら成功、そうでないなら失敗(失敗動作は例外の発生だったり、つじつまを合わせるために結果をnullにしたり)させること」です。
|
42
42
|
|
43
|
-
決して「基底クラスの派生クラスでないものを無理やり派生クラスに改変する」ようなものではありません。全然目的が違うのです。
|
43
|
+
決して「基底クラスの派生クラスでないものを無理やり派生クラスに改変する」ようなものではありません。全然目的が違うのです。
|
44
|
+
|
45
|
+
---
|
46
|
+
追記、結論を言い忘れました。ダウンキャストの目的を考えるならおそらく次のようにすべきと思います。
|
47
|
+
|
48
|
+
```Python
|
49
|
+
a = some_function() # AまたはAの派生のBのインスタンスを返すような関数
|
50
|
+
b = a if isinstance(a, B) else None
|
51
|
+
# もしaがBのインスタンスならbにはそのインスタンスが設定されそうでなければNoneが設定される
|
52
|
+
```
|
1
訂正
answer
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
結論から言えば「おおきく道を間違えている」といえると思います。
|
2
2
|
|
3
3
|
|
4
|
-
|
4
|
+
参照しておられるサイトは(大変失礼かつ生意気な言いようですが)Pythonの型システムの設計に踏み込んだ議論が不足していると思います。(スミマセン、元の記述は言い方がおかしかったので訂正しました)。
|
5
5
|
|
6
6
|
Pythonでは動的なインスタンスの改変をかなり「ゆるく」許しており「型を表す重要なフィールドである`__class__`も場合によっては簡単に改変できる」ようになっています。しかしながら「それを変更することで何が起きるかは言語システムでは何も保証していないに近い」です。
|
7
7
|
|