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.
Author by
parxier
Updated on July 19, 2020Comments
-
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 over 12 yearsS.Lott - why not? (Not arguing- just curious)
-
Stephan over 11 yearsI'm getting errors when using flake8, pyflakes when using this notation. I get redefinition of function 'elegant' warnings.
-
Hibou57 almost 10 yearsWith 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 almost 10 years@S.Lott: ok but what's your workaround to the limitation of lambdas not allowing docstrings though?