George V. Neville-Neil wrote: > I have been trying to switch this over to using properties, which seem > at first glance to be cleaner, but which I am having a lot of problems > with. In particular I want to add a property to an object, not a > class.
You can't. The underlying mechanism (descriptors) works on the class level. > The field list in a class is actually relatively static but I > wind up with ugly code like: > > class ethernet(pcs.Packet): > """Ethernet""" > __layout__ = pcs.Layout() > _map = ethernet_map.map > > src = pcs.StringField("src", 48) > dst = pcs.StringField("dst", 48) > type = pcs.Field("type", 16) >From the piece of code you present I would guess that the above class attributes are superfluous. Or doesn't pcs.Packet.__init__() do the self.src = ... thingy? > def __init__(self, bytes = None, timestamp = None): > """initialize an ethernet packet""" > > src = pcs.StringField("src", 48) > dst = pcs.StringField("dst", 48) > type = pcs.Field("type", 16) > > pcs.Packet.__init__(self, [dst, src, type], bytes = bytes) > self.description = inspect.getdoc(self) > > and assigning the properties at class time means that it's hard to have > variations, packets with the same name but with slightly varying field > lists. What's so hard about subclassing? > So, is there a way to assign a property to an object, like this: > > def __init__(.... > self.src = property() > > or something like that? You can make a property that delegates its behaviour, e. g: import new def get_src_one(self): return 42 class A(object): src = property(lambda self: self.get_src()) def __init__(self, get): self.get_src = new.instancemethod(get, self) a = A(get_src_one) print a.src But -- ceterum censeo -- subclassing is probably better, cleaner and faster. Then instead of calling the class directly make a factory function that picks the appropriate subclass. Peter -- http://mail.python.org/mailman/listinfo/python-list