Greetings:
I have a class that implements a die (singular or dice). Here is the class
definition:
>>>>>>>
class Die(object):
"""Implements a gaming die.
Attributes:
n: the number of sides
Must correspond to the number of sides on a physical die.
value: The die face currently facing up. Guaranteed to be in the
range 1 <= value <= n.
Methods:
init: instantiate a die
roll: roll the die; set and return the new value
set: set the die's value to an arbitrary, in range, value
__repr__
__lt__
__le__
__eq__
__ne__
__gt__
__ge__
__cmp__
"""
def __init__(self, nsides = 6, firstval = 'r'):
"""create a die
usage: x = die(n, firstval) -> an 'n'-sided die with
value='firstval'
Arguments:
nsides: the number of sides
valid: 3, 4, 5, 6, 7, 8, 10, 12,
14, 16, 20, 24, 30, 50, 100
default: 6
Must correspond to the number of sides on a physical die.
Using an invalid value causes an exception.
firstval: the die's initial value;
valid: 'r' - random value between 1 and n
n - specified value; must be between 1 and n
Using an invalid value causes an
exception.
default: 'r'
"""
validn = (3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 30, 50, 100)
if nsides not in validn:
errmsg = "No die has %s sides. Valid values are: %s."
raise ValueError(errmsg % (nsides, validn))
self.n = nsides
if firstval == 'r':
self.value = randint(1, self.n)
elif isinstance(firstval, int):
if 1 <= firstval <= self.n:
self.value = firstval
else:
errmsg = "%s is not between 1 and %s."
raise ValueError (errmsg % (firstval, self.n))
else:
errmsg = "%s is invalid. Valid entries are '%s' " \
"or an integer between 1 and %s."
raise ValueError(errmsg % (firstval, 'r', self.n))
def roll(self):
"""roll the die; set and return the new value"""
self.value = randint(1, self.n)
return self.value
def set(self, newval):
"""set the die's new value IF between 1 and n;
else raise exception
"""
if isinstance(newval, int):
if 1 <= newval <= self.n:
self.value = newval
else:
errmsg = "%s is not between 1 and %s."
raise ValueError (errmsg % (newval, self.n))
else:
errmsg = "%s is invalid. Valid entries are ' " \
"integers between 1 and %s."
raise ValueError(errmsg % (newval, self.n))
# special methods
def __cast(self, other):
if isinstance(other, Die): return other.value
else: return other
def __repr__(self): return repr(self.value)
def __lt__(self, other): return self.value < self.__cast(other)
def __le__(self, other): return self.value <= self.__cast(other)
def __eq__(self, other): return self.value == self.__cast(other)
def __ne__(self, other): return self.value != self.__cast(other)
def __gt__(self, other): return self.value > self.__cast(other)
def __ge__(self, other): return self.value >= self.__cast(other)
def __cmp__(self, other): return cmp(self.value, self.__cast(other))
>>>>>>>
This all seems to work okay.
I want the assignment operator ('=') to call the set method transparently on
Die instances, as in this fictitious example:
#######
@BCARROLL[Python]|2> mydie = Die(6,3)
@BCARROLL[Python]|3> mydie.n
<3> 6
@BCARROLL[Python]|4> mydie.value
<4> 3
@BCARROLL[Python]|5> mydie
<5> 3
@BCARROLL[Python]|6> mydie = 5
@BCARROLL[Python]|7> mydie
<7> 5
@BCARROLL[Python]|8> mydie.value
8> 5
@BCARROLL[Python]|9>
#######
Above, the statement "mydie = 5" resets mydie.value and preserves mydie as a
Die instance. The actual (undesired) behavior rebinds the mydie to the int
object, and the Die instance is lost:
>>>>>>>
@BCARROLL[Python]|2> mydie = Die(6,3)
@BCARROLL[Python]|3> mydie.n
<3> 6
@BCARROLL[Python]|4> mydie.value
<4> 3
@BCARROLL[Python]|5> mydie
<5> 3
@BCARROLL[Python]|6> mydie = 5
@BCARROLL[Python]|7> mydie
<7> 5
@BCARROLL[Python]|8> mydie.value
---------------------------------------------------------------------------
exceptions.AttributeError Traceback (most recent call last)
\\psc.pscnet.com\shares\home\bgcarroll\My Documents\My
Projects\study\Python\<console>
AttributeError: 'int' object has no attribute 'value'
@BCARROLL[Python]|9>
>>>>>>>
How do I overload the '=' operator to give the desired behavior?
Regards,
Barry
[EMAIL PROTECTED]
541-302-1107
________________________
We who cut mere stones must always be envisioning cathedrals.
-Quarry worker's creed
_______________________________________________
Tutor maillist - [email protected]
http://mail.python.org/mailman/listinfo/tutor