inheritance, types, operator overload, head ache
Bruno Desthuilliers
bdesth.quelquechose at free.quelquepart.fr
Fri Jul 7 20:23:04 EDT 2006
thorley at gmail.com a écrit :
> I'm working with the following code. I included some tests to make it
> easy to see--if you run the code--what troubles I'm having.
>
> Can some one *please* splain me why str(obj) works but not print obj,
May have something to do with escape chars... I tried with:
def __str__(self):
return repr(self)
and it did the trick for printing. Now it may have other side-effects, I
don't know.
> and why obj.__int__() works, but not int(obj).
I've added tracing to __int__, and it isn't called. FWIW, str type has
no attribute __int__, so I guess there's something special in the
implementation here.
> I just don't get it. :(
FWIW, you have another problem to solve:
>>> b1 = Byte(1)
>>> b1
'\x01'
>>> b1.__int__()
1
>>> b2 = Byte(2)
>>> b2
'\x02'
>>> b2.__int__()
2
>>> b1.__int__()
2
cf below...
(snip)
>
> <code>
> import struct
> class Byte(str): # Implement Bytes as str for easy adding and joining
(snip)
> def __new__(self, val):
Actually, __new__ is a static method, and it takes the class as first
argument. So...
> if type(val) == str and not val.isdigit():
> val = struct.unpack('B', val) #ensure input is valid struct
> byte
> self._byte = struct.pack('B', val)
> self._int = int(val)
.. since the name "self" really references the class, not the instance,
the two previous lines (re)bind *class* attributes "_byte" and "_int" to
class Byte.
> return str.__new__(self, self._byte)
What you want here is to first create the instance, and only then bind
to it:
def __new__(cls, val):
if type(val) == str and not val.isdigit():
val = struct.unpack('B', val)
_byte = struct.pack('B', val)
self = str.__new__(cls, _byte)
self._byte = _byte
self._int = int(val)
return self
(snip)
More information about the Python-list
mailing list