On Mar 30, 10:53 am, David Bolen <db3l....@gmail.com> wrote: > mark.sea...@gmail.com writes: > > class myclass(object): > > # > > # def __new__(class_, init_val, size, reg_info): > > def __init__(self, init_val, size, reg_info): > > > # self = object.__new__(class_) > > self.reg_info = reg_info > > print self.reg_info.message > > self.val = self > > Note that here you assign self.val to be the object itself. Are you > sure you didn't mean "self.val = init_val"? > > > (...) > > def __int__(self): > > return self.val > > Instead of an integer, you return the current class instance as set up > in __init__. The __int__ method ought to return an integer. > > > def __long__(self): > > return long(self.val) > > And this will be infinite recursion, since long(<obj>) will try to > call the __long__ method on <obj> so you're just recursing on the > __long__ method. > > You can see this more clearly with: > > >>> cat = myclass(0x55, 32, my_reg) > >>> int(cat) > Traceback (most recent call last): > File "<stdin>", line 1, in <module> > TypeError: __int__ returned non-int (type myclass) > >>> > > I won't post the traceback for long(cat), as it's, well, "long" ... > > -- David
Hi David; Yep I had fixed up that version actually. Here is the latest. from ctypes import * class REG_INFO(Structure): _fields_ = [ ('address', c_ubyte), ('message', c_char * 256), ('size', c_ubyte) ] class myclass(object): # # def __new__(class_, init_val, size, reg_info): def __init__(self, init_val, reg_info): # self = object.__new__(class_) self.reg_info = reg_info print reg_info.message self.val = init_val self.size = reg_info.size self.addr = reg_info.address print 'address = 0x%02X' % self.addr # return self # def __getitem__(self, index): # gets a single bit if index >= self.size: return self.val return (self.val >> index) & 1 # def __get__(self): # gets a single bit return self.val # def __setitem__(self,index,value): # sets a single bit if index >= self.size: self.val = value return value = (value&1L)<<index mask = (1L)<<index self.val = (self.val & ~mask) | value return # def __int__(self): return self.val # def __long__(self): return long(self.val) # # # setup my_reg = REG_INFO() my_reg.address = 0xab my_reg.message = 'hello world' my_reg.size = 32 print 'TEST 1' dog = 0x123456789ABCDEF0 print 'type(dog) = %s' % type(dog) print 'dog val = 0x%016X' % dog print 'TEST 2' cat = myclass(0x55, my_reg) print 'type(cat) = %s' % type(cat) print 'cat val = 0x%016X' % cat print 'TEST 3' bird = myclass(dog, my_reg) print 'type(bird) = %s' % type(bird) print 'bird val = 0x%016X' % bird print 'TEST 4' print bird print 'bird[0] val = 0x%01X' % bird[0] bird[0] = ~bird[0] print 'bird val = 0x%016X' % bird print 'bird[0] val = 0x%01X' % bird[0] When Run: TEST 1 type(dog) = <type 'long'> dog val = 0x123456789ABCDEF0 TEST 2 hello world address = 0xAB type(cat) = <class '__main__.myclass'> cat val = 0x0000000000000055 TEST 3 hello world address = 0xAB type(bird) = <class '__main__.myclass'> Traceback (most recent call last): File "C:\(big path)\bignum5.py", line 69, in <module> print 'bird val = 0x%016X' % bird TypeError: int argument required -- http://mail.python.org/mailman/listinfo/python-list