Welcome to the Treehouse Community

Want to collaborate on code errors? Have bugs you need feedback on? Looking for an extra set of eyes on your latest project? Get support with fellow developers, designers, and programmers of all backgrounds and skill levels here with the Treehouse Community! While you're at it, check out some resources Treehouse students have shared here.

Looking to learn something new?

Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and join thousands of Treehouse students and alumni in the community today.

Start your free trial

Python Object-Oriented Python Dice Roller RPG Roller

Nathan Magyar
Nathan Magyar
11,332 Points

Python OOP Problem

I need to use code similar to Hand.roll(2) and to get back an instance of Hand with two D20s rolled in it. I should then be able to call .total on the instance to get the total of the two dice.

Based on the instructions, it sounds like I need to use the .roll() method to create a Hand instance with two 20-sided die, imported from a separate file. When I run the code below I get an error saying that the interpreter couldn't get the length of the Hand instance.

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 __init__(self, size=0, die_class=D20, *args, **kwargs):
        super().__init__()

        for _ in range(size):
            self.append(die_class())
        self.sort()

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

    def roll(self, size):
        self.__init__(size=size)

2 Answers

Try to change your roll() into a class method. The hint is on 'Hand.roll(2)'. They want to call on the class, and not on instance. So a class method is appropriate. Happy coding

from dice import D20

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

        for _ in range(size):
            self.append(die_class())
        self.sort()

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

    @classmethod
    def roll(cls, size):
        self.__init__(size=size)   
Nathan Magyar
Nathan Magyar
11,332 Points

Thanks for your response, Jasper. Unfortunately that code doesn't pass the test(s). I wish it gave me a more descriptive error message so I could be more specific for you.

Hello, Nathan. It's weird because I tested it and it passed. Sometimes the challenges console misbehaves for some unknown reasons. I usually click the restart button to reset it, and it works most of the times. The only slight difference between your code and mine is on the previous challenge.

class D20(Die):
    def __init__(self, sides=20):
        super().__init__(sides)