# The Property member

The `Property` member looks a lot like a normal Python property which makes it quite different from other members. In particular because there is no way from atom to know when the value returned by a `Property` changes, no notifications are emitted by default when getting or setting it.

## Defining a Property member

Defining a `Property` and the getter, setter and deleter associated to it can be done in several equivalent manners illustrated below:

    from atom.api import Atom, Property, Value

    def get_v(owner):
        return owner.v

    def set_v(owner, value):
        owner.v = value

    def del_v(owner):
        del owner.v

    class MyAtom(Atom):

        v = Value()

        p1 = Property(get_v, set_v, del_v)

        p2 = Property()

        def _get_p2(self):
            return get_v(self)

        def _set_p2(self, value):
            set_v(self, value

        def _del_p2(self):
            del_v(self)

        p3 = Property()

        p3.getter
        def _get(self):
            return get_v(self)

        p3.setter
        def _set(self, value):
            set_v(self, value)

        p3.deleter
        def _del(self):
            del_v(self)

## Cached properties

For read-only properties, atom offers the option to cache the value returned by the getter. This can be convenient if the getter performs an expensive operation. The cache can be reset at a later time by deleting the property or by calling the `atom.property.Property.reset()` method of the member as illustrated below:

    from atom.api import Atom, Property, cached_property

    class MyAtom(Atom):

        cp1 = Property(cached=True)

        def _get_cp1(self):
            print('Called cp1')

        @cached_property
        def cp2(self):
            print('Called cp2')

    a = MyAtom()

    a.cp1
    a.cp1
    del a.cp1
    a.cp1

    a.cp2
    a.cp2
    MyAtom.cp2.reset(a)
    a.cp2

Running this code will print “Called cp1/2” only twice each.

## Notifications from a Property

As mentionned in the introduction, `Property` does not fire notifications upon get/setattr. However it will always fire notifications upon deletion/reset. To manually fire notifications from a property, please refer to Manual notifications.