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 trialNathan Magyar
11,332 PointsPython 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.
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)
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
Jasper Maposa
26,918 PointsTry 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)
Jasper Maposa
26,918 PointsHello, 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)
Nathan Magyar
11,332 PointsNathan Magyar
11,332 PointsThanks 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.