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

回答編集履歴

2

super()であるべき

2019/09/14 12:00

投稿

quickquip
quickquip

スコア11314

answer CHANGED
@@ -69,4 +69,21 @@
69
69
  def __init__(self,app):
70
70
  tk.Canvas.__init__(self,app)
71
71
  ```
72
- これは動きます。`GameBoard.__init__`が定義されているので、`GameBoard(...)`でGameBoardをインスタンス化すると`GameBoard.__init__`が動いて、その中で`tk.Canvas.__init__`が実行されるので`tk.Canvas`に必要な処理がされるからです。
72
+ これは動きます。`GameBoard.__init__`が定義されているので、`GameBoard(...)`でGameBoardをインスタンス化すると`GameBoard.__init__`が動いて、その中で`tk.Canvas.__init__`が実行されるので`tk.Canvas`に必要な処理がされるからです。
73
+
74
+ ----
75
+
76
+ ところで、Python3ではこう書くべきです。
77
+
78
+ ```python
79
+ class GameBoard(tk.Canvas):
80
+ def __init__(self,app):
81
+ super().__init__(self,app)
82
+ ```
83
+
84
+ Python公式ドキュメントの
85
+ [super()の説明](https://docs.python.org/ja/3/library/functions.html#super)
86
+ [3.0のWhat's New](https://docs.python.org/ja/3/whatsnew/3.0.html#builtins)
87
+ [多重継承の項](https://docs.python.org/ja/3/tutorial/classes.html#multiple-inheritance)
88
+ を参考に。
89
+ プログラマが"自分でこれが上位だと思っている"クラス名をハードコードするのはちょっとだけ危険です。

1

誤解がでないように GameBoard() の表記を GameBoard(...) に変更

2019/09/14 12:00

投稿

quickquip
quickquip

スコア11314

answer CHANGED
@@ -50,7 +50,7 @@
50
50
  app.mainloop()
51
51
  ```
52
52
 
53
- これは動きます。`GameBoard.__init__`が定義されていないので、`GameBoard()`でGameBoardをインスタンス化すると`tk.Canvas.__init__`が動くからです。
53
+ これは動きます。`GameBoard.__init__`が定義されていないので、`GameBoard(...)`でGameBoardをインスタンス化すると`tk.Canvas.__init__`が動くからです。
54
54
 
55
55
  ----
56
56
 
@@ -60,7 +60,7 @@
60
60
  pass
61
61
  ```
62
62
 
63
- これは動きません。`GameBoard.__init__`が定義されているので、`GameBoard()`でGameBoardをインスタンス化すると`GameBoard.__init__`が動きますがその実装が空なので、`tk.Canvas.__init__`が**実行されることがない**からです。
63
+ これは動きません。`GameBoard.__init__`が定義されているので、`GameBoard(...)`でGameBoardをインスタンス化すると`GameBoard.__init__`が動きますがその実装が空なので、`tk.Canvas.__init__`が**実行されることがない**からです。
64
64
 
65
65
  ----
66
66
 
@@ -69,4 +69,4 @@
69
69
  def __init__(self,app):
70
70
  tk.Canvas.__init__(self,app)
71
71
  ```
72
- これは動きます。`GameBoard.__init__`が定義されているので、`GameBoard()`でGameBoardをインスタンス化すると`GameBoard.__init__`が動いて、その中で`tk.Canvas.__init__`が実行されるので`tk.Canvas`に必要な処理がされるからです。
72
+ これは動きます。`GameBoard.__init__`が定義されているので、`GameBoard(...)`でGameBoardをインスタンス化すると`GameBoard.__init__`が動いて、その中で`tk.Canvas.__init__`が実行されるので`tk.Canvas`に必要な処理がされるからです。