Python Object-Oriented Python Dice Roller RPG Roller

MoatazBellah Ghobashy
MoatazBellah Ghobashy
8,748 Points

What the wrong in my code!!!

I tested my code on my local program and works fine but here keeps showing this message "Can't get the length of a Hand"

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):
    def roll(self, size):
        for _ in range(size):
            self.append(D20())  

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

3 Answers

Steven Parker
Steven Parker
171,373 Points

The instructions say, " I'm going to use code similar to Hand.roll(2) ..."

The example showing the method being called directly on the class itself is a clue that this should be implemented as a class method instead of a normal instance method.

Also, your method doesn't currently return anything, and the challenge wants "to get back an instance of Hand with two D20s rolled in it."

I don't know why this doesn't work (and the Treehouse Code Challenge just says 'try again'.) Can anyone help me please? Thank you.

hands.py

from dice import D20

class Hand(list):
    def __init__(self, size, die_class, *args, **kwargs):
        super().__init__()

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

    @classmethod
    def roll(cls, size=2):
        for _ in range(size):
            self.append(D20())
        return cls(size, die_class)

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)
Steven Parker
Steven Parker
171,373 Points

When you post a question as an "answer" to another question, only the folks who asked and answered the other one are likely to see it. To reach the entire student population, always create a new question.

Ah didn't realize that. Thank you much