Python Object-Oriented Python Dice Roller RPG Roller

Christopher Blanton
Christopher Blanton
18,619 Points

I get the error message: `Didn't get 'D20's in my 'Hand' instance` when appending D20s to the hand.

When I put this into my interpreter it gives me a list of D20s and I am definitely appending D20s to the dih list? I know I'm missing something and I bet it's going to be silly.

dice.py
import random


class Die:
    def __init__(self, sides=2):
        if sides < 2:
            raise ValueError("Can't have fewer than two sides")
        self.sides = sides
        self.value = random.randint(1, sides)

    def __int__(self):
        return self.value

    def __add__(self, other):
        return int(self) + other

    def __radd__(self, other):
        return self + other

class D20(Die):
    def __init__(self):
        super().__init__(sides=20)
hands.py
from dice import D20

class Hand(list):
    @property
    def total(self):
        return sum(self)

    @classmethod
    def roll(cls, qty):
        dih = []
        for _ in range(qty):
            dih.append(D20)
        return dih

2 Answers

Steven Parker
Steven Parker
201,997 Points

It looks like the D20's are being added to an ordinary list instead of an instance of "Hand". The "cls" function is useful for creating a new Hand.

Steven Parker
Steven Parker
201,997 Points

Oh, and you also need parentheses when you create a D20 instance:

            dih.append(D20())
Christopher Blanton
Christopher Blanton
18,619 Points

Using the parenthasis after the D20 was the issue, thanks!

Christopher Blanton
Christopher Blanton
18,619 Points

I get this error when passing the list to the class as well using cls(dih).