Python Object-Oriented Python Dice Roller RPG Roller

Max Palmer
Max Palmer
2,920 Points

Questions regarding classmethods and self.append

Not sure what is going wrong here. Think I may be something to do with the append, as previously I noted that it only works with the self argument, so it would update the current instance (hand) with the dice.

However on this occasion it is a class method so unsure how to settle using self in class method.

The errror I get is cannot find the lengthof 'Hand', which I assume is refering to the Hand in Hand(list)

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):
    @property
    def total(self):
        return sum(self)

    @classmethod
    def roll(cls, size):
        super().__init__()

        for _ in range(size):
            cls.append(D20())

1 Answer

Steven Parker
Steven Parker
201,997 Points

Here's a few hints:

  • you won't need to call "super" for anything
  • the "cls" parameter refers to the class itself and has no "append" method
  • but you can use "cls" to create a new instance, which does have "append"
  • the method needs to eventually "return" the new instance
Max Palmer
Max Palmer
2,920 Points

That was really useful, I took that on and rewatched the video about class methods then rewrote the hands code. There still seems to be an error however. Am i missing something out?

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

@classmethod
def roll(cls, size):
    numbers = []

    for _ in range(size):
        numbers.append(D20())

    return cls(numbers)
Max Palmer
Max Palmer
2,920 Points

disregard previous comment, I left out the import bit. Thanks for your help and I hope to give back to the community as much as you helped me.