views:

379

answers:

3

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)
+2  A: 

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.

Benno
+1: Please do not use lambdas. Please.
S.Lott
+2  A: 

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.

Ignacio Vazquez-Abrams
+1  A: 

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())
Toni Ruža