回答編集履歴

3 追記

LouiS0616

LouiS0616 score 34853

2018/01/16 16:14  投稿

第一引数にインスタンスが暗に渡されることに留意する必要があります。
次のように定義実装してください。
```Python
def shoot(self, v):
   return random.randint(1,v)
```
なお、Pythonでは`sai.shoot(6)`は`Dice.shoot(sai, 6)`と同等に扱われます。
---
> 逆にselfを使わなかったらどうやってやるのかと気になったので
> 上記の様なものを試してみたのですが何度試してもうまくいきませんでした
なるほど。確かにこのメソッドにはselfが不要です。
このような際は、staticメソッドにすることも解決策の一つになります。
```Python
@staticmethod
def shoot(v):
   return random.randint(1,v)
```
呼び出す際は`Dice.shoot(6)`と呼び出すようにしてください。
ただの関数として定義してもいいかもしれません。このあたりは設計に依ります。
ただの関数として定義してもいいかもしれません。このあたりは設計に依ります。
コメントを受けて
---
> sai.shoot(6)はDice.shoot(sai,6)の様に置き換えられてしまうので
> shootメソッドを実行したらvの部分に6ではなくsaiが代入されエラーが起こる
単純に引数の個数が違うと判断されてしまうからです。
```Python
>>> def hoge(a):
...    pass
...
>>> hoge(1, 2)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
TypeError: hoge() takes exactly 1 argument (2 given)
```
---
> メソッドもそれに対応した余分な0番目の引数を
> def shoot(self, v)
> 用意しておく必要がある
はい。**インスタンスメソッド**の場合そうなります。
---
> 後、一応自分でも入力して確かめてみてきちんと動くのを確認しましたが
> 回答してくださったスクリプトは
> (中略)
> selfでなくても大丈夫ですよね?
その通りです。selfというのは慣習的に使われているにすぎません。
ただし、self以外の名前を使う合理性がないので、selfを使った方が良いでしょう。
Pythonのコーディング規約であるPEP8([日本語](http://pep8-ja.readthedocs.io/ja/latest/)・[本家](https://www.python.org/dev/peps/pep-0008/))にも次のように記載されています。
> Always use `self` for the first argument to instance methods.
2 追記

LouiS0616

LouiS0616 score 34853

2018/01/16 12:36  投稿

第一引数にインスタンスが暗に渡されることに留意する必要があります。
次のように定義実装してください。
```Python
def shoot(self, v):
   return random.randint(1,v)
```
なお、Pythonでは`sai.shoot(6)`は`Dice.shoot(sai, 6)`と同等に扱われます。  
 
---  
> 逆にselfを使わなかったらどうやってやるのかと気になったので
> 上記の様なものを試してみたのですが何度試してもうまくいきませんでした
なるほど。確かにこのメソッドにはselfが不要です。
このような際は、staticメソッドにすることも解決策の一つになります。
```Python
@staticmethod
def shoot(v):
   return random.randint(1,v)
```
呼び出す際は`Dice.shoot(6)`と呼び出すようにしてください。  
 
ただの関数として定義してもいいかもしれません。このあたりは設計に依ります。
1 追記

LouiS0616

LouiS0616 score 34853

2018/01/16 12:34  投稿

第一引数にインスタンスが暗に渡されることに留意する必要があります。
次のように定義実装してください。
```Python
def shoot(self, v):
   return random.randint(1,v)
```
```
> 逆にselfを使わなかったらどうやってやるのかと気になったので
> 上記の様なものを試してみたのですが何度試してもうまくいきませんでした
なるほど。確かにこのメソッドにはselfが不要です。
このような際は、staticメソッドにすることも解決策の一つになります。
```Python
@staticmethod
def shoot(v):
   return random.randint(1,v)
```
ただの関数として定義してもいいかもしれません。このあたりは設計に依ります。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る