Python Object-Oriented Python Dice Roller RPG Roller

Ryan Gostic
Ryan Gostic
20,790 Points

Bummer: Can't get the length of a 'Hand'

I am struggling with python classes. What exactly am I doing wrong here?

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, Die

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

    def roll(self, num):
        for i in range(num):
            self.append(dice.D20())

    def __len__(self):
        return len(super())

1 Answer

Chris Freeman
MOD
Chris Freeman
Treehouse Moderator 55,163 Points

Hi Ryan, you have the right idea. Here are some items to correct in hand.py:

less important:

  • do not need to import die. Only D20 is needed.
  • for class methods it is customary to use cls instead of self as the first parameter

important:

  • fix mixed use of TAB and SPACE in the code. All spaces is preferred.
  • need to declare roll as class method using the @classmethod decorator so it's available without an instance.
  • a class method does not have an instance to operate upon. so create one using
    hand = cls()
  • D20 is directly available due to import so it can be appended directly using hand.append(D20())
  • finally, need to return the created instance: return hand
  • do not need to create local __len__ method. It is inherited automatically from list

Post back if you need more help. Good luck!!

Ryan Gostic
Ryan Gostic
20,790 Points

Thanks for the feedback!