[Python-Dev] Extended Function syntax (original) (raw)

Just van Rossum just@letterror.com
Tue, 28 Jan 2003 23:41:42 +0100


Guido van Rossum wrote:

> class Parrot(object): > class count(Property): > def Get(prop, self): > return self.count > def Set(prop, self, value): > self.count = value > def Del(prop, self): > self.count = 0 > count = count('Current parrot count') > count = 0

I'm not sure that this has much to recommend it over the current approach. The unused 'prop' argument smells like a remnant of the implementation.

OTOH, if the class were merely used as a container (and never instantiated), it looks fairly decent (and indeed doesn't need a [filter] modifier, as MWH already suggested):

class Parrot(object):
    _count = 0
    class count(Property):
        """The count property."""
        def __get__(self):
            return self._count
        def __set__(self, value):
            self._count = value
        def __del__(self):
            self._count = 0

Still, a lot of magic... This is the Property class going with the above:

class Property(object):
    class __metaclass__(type):
        def __new__(cls, name, bases, methods):
            if not bases or bases[0] == object:
                # this is to make the Property class itself...
                return type.__new__(cls, name, bases, methods)
            return property(methods.get("__get__"),
                            methods.get("__set__"),
                            methods.get("__del__"),
                            methods.get("__doc__"))

Just