It would be nice if we had more control over the names of the properties being generated. One way to allow would be to let you specify the properties using attributes:
class Widget(object):
    __metaclass__ = __bitproperties__
    style = 0
    enabled       = bit_property(ENABLED)
    simple_border = bit_property(SIMPLE)
    sunken_border = bit_property(SUNKEN)
    raised_border = bit_property(RAISED)
    transparent_background = bit_property(TRANSPARENT)
Implement the bit_property class and finish implementing the __new__ magic method.
class bit_property(object):
    """define this class"""
class __bitproperties__(type):
    def __new__(meta, classname, bases, classDict):
        bitprops = (item for item in classDict.items()
                    if isinstance(item[1], bit_property))
        # Modify the classDict object here
        return type.__new__(meta, classname, bases, classDict)
ENABLED, SIMPLE, SUNKEN, RAISED, TRANSPARENT = 1, 2, 4, 8, 16
class Widget(object):
    __metaclass__ = __bitproperties__
    style = 0
    enabled       = bit_property(ENABLED)
    simple_border = bit_property(SIMPLE)
    sunken_border = bit_property(SUNKEN)
    raised_border = bit_property(RAISED)
    transparent_background = bit_property(TRANSPARENT)
w = Widget()
w.enabled = True
print w.style               # 1
w.sunken_border = True
print w.style               # 5
w.transparent_background = True
print w.style               # 21
w.sunken_border = False
print w.style               # 17
Expected output:
1 5 21 17
Hints:
Solution: bitfield2.py