A way to write properties

Arnaud Delobelle arnodel at gmail.com
Mon Jan 23 06:45:11 EST 2012


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



More information about the Python-list mailing list