Python Object-Oriented Python Dice Roller RPG Roller

Amelia Nakimuli
Amelia Nakimuli
3,242 Points

Calling a class

I'm not sure how to call the D20 value in the classmethod. Is the rest of my code alright?

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
#In the hands.py file import the D20 class from dice.py.
from dice import D20

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

#Create a classmethod named roll
    @classmethod 
    def roll(cls, num_dice):
        dice_list = []
        for x in range(num_dice):
            dice_list = dice_list.append(D20)
            return dice_list
        return cls(dice_list)

1 Answer

Steven Parker
Steven Parker
201,997 Points

It may look like "calling" a function, but with a class it's "instantiating" or "creating a new instance".

Like calling a function, you add parentheses after the name; and you don't want an assignment here:

            dice_list.append(D20())

Also, you won't want that "return" inside the loop. Just keep the one after the loop.

Amelia Nakimuli
Amelia Nakimuli
3,242 Points

It worked, thank you for the help