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