Python Decorator For Attribute And Method?
Solution 1:
You'll need to implement a __get__ method returning a callable; your decorator already provides a descriptor object, simply make it work when accessing as an attribute.
This can be as simple as turning around and binding the wrapped function (so you get a bound method):
classattributeSetter(object):
    ''' Makes functions appear as attributes. Takes care of autologging.'''def__init__(self, func):
        self.func = func
    def__get__(self, instance, owner):
        return self.func.__get__(instance, owner)
    def__set__(self, obj, value):
        return self.func(obj, value)
However, this makes it incompatible with simply accessing the attribute! instance.myAttrib now returns a bound method! You cannot have it both ways here; methods are simply bound attributes (so attributes that passed through the descriptor protocol), that happen to be callable.
You could of course return a proxy object from __get__; one that implements a __call__ method and otherwise tries to act as much as possible as the underlying managed instance attribute (what your function stored in self.__dict__['myAttrib']); but this path is fraught with problems as a proxy object can never truly be the underlying attribute value.
Post a Comment for "Python Decorator For Attribute And Method?"