A way to write properties

HEK elkarouh at gmail.com
Tue Jan 24 04:51:09 EST 2012


On Jan 23, 12:45 pm, Arnaud Delobelle <arno... at gmail.com> wrote:
> Hi all,
>
> It just occurred to me that there's a very simple but slightly
> different way to implement properties:
>
> class PropertyType(type):
>     def __get__(self, obj, objtype):
>         return self if obj is None else self.get(obj)
>     def __set__(self, obj, val):
>         self.set(obj, val)
>     def __delete__(self, obj):
>         self.delete(obj)
>
> class Property(metaclass=PropertyType):
>     pass
>
> # Here is an example:
>
> class Test:
>     class x(Property):
>         "My property"
>         def get(self):
>             return "Test.x"
>         def set(self, val):
>             print("Setting Test.x to", val)
>
> # This gives:
>
> >>> t = Test()
> >>> t.x
> 'Test.x'
> >>> t.x = 42
>
> Setting Test.x to 42>>> Test.x
> <property 'x'>
> >>> Test.x.__doc__
>
> 'My property'
>
> It also allows defining properties outside class scopes:
>
> class XPlus1(Property):
>     "My X Property + 1"
>     def get(self):
>         return self.x + 1
>     def set(self, val):
>         self.x = val - 1
>
> class A:
>     def __init__(self):
>         self.x = 0
>     x_plus_one = XPlus1
>
> class B:
>     def __init__(self):
>         self.x = 2
>     x_plus_one = XPlus1
>
> >>> a = A()
> >>> b = B()
> >>> a.x
> 0
> >>> a.x_plus_one
> 1
> >>> b.x_plus_one
>
> 3
>
> I don't know why one would want to do this though :)
>
> --
> Arnaud

Nice idea.
What would be the python2.7 version (adding __metaclass__=PropertyType
didn't help) ?
Many thanks



More information about the Python-list mailing list