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

回答編集履歴

3

誤記

2018/11/14 03:58

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

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

追記

2018/11/14 03:58

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

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

訂正

2018/11/14 03:55

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -1,7 +1,7 @@
1
1
  結論から言えば「おおきく道を間違えている」といえると思います。
2
2
 
3
3
 
4
- 一方参照しておられるサイトは(大変失礼かつ生意気な言いようですが)ちょっとやってみた程度の内容であってPythonの型システムの設計をほとど何も考慮していない記事だと思います。
4
+ 参照しておられるサイトは(大変失礼かつ生意気な言いようですが)Pythonの型システムの設計に踏み込だ議論が不足していと思います。(スミマセン、元の記述は言い方がおかしかったので訂正しました)。
5
5
 
6
6
  Pythonでは動的なインスタンスの改変をかなり「ゆるく」許しており「型を表す重要なフィールドである`__class__`も場合によっては簡単に改変できる」ようになっています。しかしながら「それを変更することで何が起きるかは言語システムでは何も保証していないに近い」です。
7
7