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

回答編集履歴

3

追記

2018/01/16 07:14

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -21,4 +21,39 @@
21
21
 
22
22
  呼び出す際は`Dice.shoot(6)`と呼び出すようにしてください。
23
23
 
24
- ただの関数として定義してもいいかもしれません。このあたりは設計に依ります。
24
+ ただの関数として定義してもいいかもしれません。このあたりは設計に依ります。
25
+
26
+ コメントを受けて
27
+ ---
28
+ > sai.shoot(6)はDice.shoot(sai,6)の様に置き換えられてしまうので
29
+ > shootメソッドを実行したらvの部分に6ではなくsaiが代入されエラーが起こる
30
+
31
+ 単純に引数の個数が違うと判断されてしまうからです。
32
+ ```Python
33
+ >>> def hoge(a):
34
+ ... pass
35
+ ...
36
+ >>> hoge(1, 2)
37
+ Traceback (most recent call last):
38
+ File "<stdin>", line 1, in <module>
39
+ TypeError: hoge() takes exactly 1 argument (2 given)
40
+ ```
41
+
42
+ ---
43
+ > メソッドもそれに対応した余分な0番目の引数を
44
+ > def shoot(self, v)
45
+ > 用意しておく必要がある
46
+
47
+ はい。**インスタンスメソッド**の場合そうなります。
48
+
49
+ ---
50
+ > 後、一応自分でも入力して確かめてみてきちんと動くのを確認しましたが
51
+ > 回答してくださったスクリプトは
52
+ > (中略)
53
+ > selfでなくても大丈夫ですよね?
54
+
55
+ その通りです。selfというのは慣習的に使われているにすぎません。
56
+ ただし、self以外の名前を使う合理性がないので、selfを使った方が良いでしょう。
57
+
58
+ Pythonのコーディング規約であるPEP8([日本語](http://pep8-ja.readthedocs.io/ja/latest/)・[本家](https://www.python.org/dev/peps/pep-0008/))にも次のように記載されています。
59
+ > Always use `self` for the first argument to instance methods.

2

追記

2018/01/16 07:14

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -5,6 +5,9 @@
5
5
  return random.randint(1,v)
6
6
  ```
7
7
 
8
+ なお、Pythonでは`sai.shoot(6)`は`Dice.shoot(sai, 6)`と同等に扱われます。
9
+
10
+ ---
8
11
  > 逆にselfを使わなかったらどうやってやるのかと気になったので
9
12
  > 上記の様なものを試してみたのですが何度試してもうまくいきませんでした
10
13
 
@@ -16,4 +19,6 @@
16
19
  return random.randint(1,v)
17
20
  ```
18
21
 
22
+ 呼び出す際は`Dice.shoot(6)`と呼び出すようにしてください。
23
+
19
24
  ただの関数として定義してもいいかもしれません。このあたりは設計に依ります。

1

追記

2018/01/16 03:36

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -3,4 +3,17 @@
3
3
  ```Python
4
4
  def shoot(self, v):
5
5
  return random.randint(1,v)
6
- ```
6
+ ```
7
+
8
+ > 逆にselfを使わなかったらどうやってやるのかと気になったので
9
+ > 上記の様なものを試してみたのですが何度試してもうまくいきませんでした
10
+
11
+ なるほど。確かにこのメソッドにはselfが不要です。
12
+ このような際は、staticメソッドにすることも解決策の一つになります。
13
+ ```Python
14
+ @staticmethod
15
+ def shoot(v):
16
+ return random.randint(1,v)
17
+ ```
18
+
19
+ ただの関数として定義してもいいかもしれません。このあたりは設計に依ります。