Michael Hudson <mwh <at> python.net> writes: > > "Phillip J. Eby" <pje <at> telecommunity.com> writes: > > > Unfortunately, finding out a descriptor's name is non-trivial; it'd be nice > > if there were a descriptor hook __bind__(cls,name) that was called by > > classes during cls.__new__ or assignment to a class attribute, and which > > you could define to return a replacement descriptor. It seems like one of > > the first metaclasses I end up writing in any new project is something to > > do this, and I believe Ian Bicking has encountered the same thing in e.g. > > SQLObject. > > I've done this many times too, but I've never really felt the need to > propose a change to Python for it. I guess one could modify the > descriptor protocol slightly, but is it worth it? Hmm, dunno. > > Cheers, > mwh >
You can use something like this to find a descriptor's name: class Private(property): def __init__(self, permission, fget=None, fset=None, fdel=None, doc=None): fget = fget or 'r' in permission and self.default_fget or None fset = fset or 'w' in permission and self.default_fset or None fdel = fdel or 'd' in permission and self.default_fget or None super(private, self).__init__(fget, fset, fdel, doc) def get_attribute_name(self, instance): my_name = None for cls in instance.__class__.mro(): for attribute_name, attribute_object in cls.__dict__.iteritems(): if attribute_object is self: my_name = attribute_name break if my_name is not None: class_name = cls.__name__ break attribute_name = '_%s__%s' % (class_name, my_name) self.attribute_name = attribute_name return attribute_name def default_fget(self, instance): try: attribute_name = self.attribute_name except AttributeError: attribute_name = self.get_attribute_name(instance) return getattr(instance, attribute_name) def default_fset(self, instance, value): try: attribute_name = self.attribute_name except AttributeError: attribute_name = self.get_attribute_name(instance) setattr(instance, attribute_name, value) def default_fdel(self, instance): try: attribute_name = self.attribute_name except AttributeError: attribute_name = self.get_attribute_name(instance) delattr(instance, attribute_name) _______________________________________________ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com