Maric Michaud a écrit : > Stef Mientki a écrit : (snip) >> # I need to read and write the individual bits of the byte object >> # so I can create 8 blocks of code like this, one for each bit position >> # I use it, like this >> # name1 = cpu_ports() >> # name1.p5 = True >> # or >> # name1.p[5] = True >> >> @apply # read / write bit 5 >> def p5(): >> def fset(self, value): >> index = 5 >> value = ( value & 1L ) << index >> mask = ( 1L ) << index >> self._d = ( self._d & ~mask ) | value >> def fget(self): >> index = 5 >> return ( self._d >> index ) & 1 >> return property(**locals()) >> >> I can optimize the above code a little bit, >> but I've the feeling that I don't need to repeat this code 8 times. > > something like that should just work (untested) : > > def bit(): > def fset(self, value): > index = 5 > value = ( value & 1L ) << index > mask = ( 1L ) << index > self._d = ( self._d & ~mask ) | value > def fget(self): > index = 5 > return ( self._d >> index ) & 1 > return property(**locals()) > > > class cpu_ports(object) : > > p1 = bit() > p2 = bit() > p3 = bit() > p4 = bit() > p5 = bit()
As a side note, properties are just an example of objects using the descriptor protocol. You can build your own descriptors for more advanced use (think : 'smart' attributes): http://users.rcn.com/python/download/Descriptor.htm http://docs.python.org/ref/descriptors.html -- http://mail.python.org/mailman/listinfo/python-list