2010-03-09 13 views
32

Jaki jest preferowany sposób definiowania właściwości klas w Pythonie i dlaczego? Czy używanie obu w jednej klasie jest OK?Preferowany sposób definiowania właściwości w języku Python: dekorator właściwości lub lambda?

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

lub

total = property(lambda self: self.field_1 + self.field_2) 
+1

Skąd widziałeś tę "właściwość przez lambdę", która sprawiłaby, że uważasz ją za "preferowaną"? Widziałeś wiele z nich? Jeśli tak, to gdzie? –

+0

@ S.Lott Niektóre książki Pythona, nie pamiętam. Użyję teraz dekoratorów. Nie ma problemu. :-) – parxier

Odpowiedz

21

Formularz dekorator jest prawdopodobnie najlepszy w przypadku, gdy już pokazano, gdzie chcesz włączyć metodę do właściwości tylko do odczytu. Drugi przypadek jest lepszy, gdy chcesz dostarczyć setter/deleter/docstring, a także getter lub jeśli chcesz dodać właściwość, która ma inną nazwę od metody, z której wywodzi się jej wartość.

+10

+1: Proszę nie używać lambdas. Proszę. –

+28

S.Lott - czemu nie? (Nie kłóci się - po prostu ciekawy) – Yarin

+0

@ S.Lott: ok, ale jaki jest twój sposób obejścia ograniczenia lambdas nie zezwalając jednak na docstrings? – smci

4

Nie używaj do tego celu lambdas. Pierwszy jest dopuszczalny dla właściwości tylko do odczytu, drugi jest używany z rzeczywistymi metodami dla bardziej złożonych przypadków.

49

Dla właściwości tylko do odczytu używam dekorator, inny zwykle zrobić coś takiego:

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

zmiana:

Najnowsze wersje Pythona wzmocnione podejście dekorator:

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

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

Otrzymuję błędy podczas korzystania z flake8, pyflakes podczas korzystania z tej notacji. Otrzymuję redefinicję funkcji "eleganckich" ostrzeżeń. – Stephan

+0

Z Pylint, istnieje dodatkowa korzyść do korzystania z dekoratora. Zobacz [Ostrzeżenie dla ostrzeżenia 'W0212' z właściwościami dostępu do chronionego elementu: jak tego uniknąć?] (Http://stackoverflow.com/questions/24833362/pylint-warning-w0212-z-opcjami-do-uzytywania--zabezpieczonego-member- how-to-avoi). Zachowuje on zdolność Pylint do sprawdzania zwróconej wartości/obiektu. – Hibou57

Powiązane problemy