Python Object-Oriented Python Dice Roller RPG Roller

Dominic Qu
Dominic Qu
2,573 Points

Now update Hand in hands.py. I'm going to use code similar to Hand.roll(2) and I want to get back an instance of Hand wi

Using the code below, I get the error message 'Wrong length for hand'. Could someone please explain what I am doing wrong and how to fix it? Much appreciated.

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, sides=20, *args, **kwargs):
        super().__init__(sides)
hands.py
from dice import D20

class Hand(list):
    def __init__(self,dice_list,*args, **kwargs):
        self = dice_list

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


    @property
    def total(self):
        return sum(self)

1 Answer

Steven Parker
Steven Parker
201,957 Points

You don't need to override "__init__", and changing the calling signature (by adding a required argument) prevents the validation mechanism from successfully creating an instance.