Preferred way of defining properties in Python: property decorator or lambda?

25,817

Solution 1

The decorator form is probably best in the case you've shown, where you want to turn the method into a read-only property. The second case is better when you want to provide a setter/deleter/docstring as well as the getter or if you want to add a property that has a different name to the method it derives its value from.

Solution 2

For read-only properties I use the decorator, else I usually do something like this:

class Bla(object):
    def sneaky():
        def fget(self):
            return self._sneaky
        def fset(self, value):
            self._sneaky = value
        return locals()
    sneaky = property(**sneaky())

update:

Recent versions of python enhanced the decorator approach:

class Bla(object):
    @property
    def elegant(self):
        return self._elegant

    @elegant.setter
    def elegant(self, value):
        self._elegant = value

Solution 3

Don't use lambdas for this. The first is acceptable for a read-only property, the second is used with real methods for more complex cases.

Share:
25,817
parxier
Author by

parxier

Updated on July 19, 2020

Comments

  • parxier
    parxier almost 4 years

    Which is the preferred way of defining class properties in Python and why? Is it Ok to use both in one class?

    @property
    def total(self):
        return self.field_1 + self.field_2
    

    or

    total = property(lambda self: self.field_1 + self.field_2)
    
  • Yarin
    Yarin over 12 years
    S.Lott - why not? (Not arguing- just curious)
  • Stephan
    Stephan over 11 years
    I'm getting errors when using flake8, pyflakes when using this notation. I get redefinition of function 'elegant' warnings.
  • Hibou57
    Hibou57 almost 10 years
    With Pylint, there is an additional benefit to use the decorator. See Pylint warning W0212 with properties accessing a protected member: how to avoid?. It preserves Pylint's ability to check the returned value/object.
  • smci
    smci almost 10 years
    @S.Lott: ok but what's your workaround to the limitation of lambdas not allowing docstrings though?