Python Object-Oriented Python Dice Roller RPG Roller

Sandy Leon
Sandy Leon
2,246 Points

How do I format my class so that it passes the check?

Hello everyone, I managed to get the output that I wanted for this program, but I am not sure how to format it in a way that is acceptable to pass the problem.

I am supposed to create a method named 'roll' that gives me the total of any number of D20() methods called. I hope my explanation is clear enough. Thank you in advance for any help.

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):
    hand = []
    @property
    def total(self):
        return sum(self.hand)

    def roll(self, size, *args, **kwargs):
        self.size = size
        for _ in range(size):
            self.hand.append(D20())
        return self.hand      

1 Answer

Chris Freeman
MOD
Chris Freeman
Treehouse Moderator 53,009 Points

You are very close! Here what you have:

class Hand(list):
    hand = []  # This variable is not needed. The Hand itself *is* a list!

    @property
    def total(self):
        return sum(self.hand)  # Since 'self' is a list, you can just use sum(self)

    # Since looking to run with `Hand.roll(2)` this needs to be decorated as a classmethod
    # As a classmethod, the first parameter should be 'cls' not 'self'
    def roll(self, size, *args, **kwargs):  # *args and **kwargs aren't used so aren't needed
        self.size = size  # no need to save size as an attribute on the class
        # cannot use instance methods until there is an instance.
        # create one use `self = cls()`
        for _ in range(size):
            # since 'self' is now a list instance, you can append using 'self.append(D20())'
            self.hand.append(D20())
        return self.hand  # return the created instance 'self' instead of 'self.hand'

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