2010-03-09 56 views
32

在Python中定義類屬性的首選方式是什麼?在一個班級中同時使用這兩種語言都可以嗎?在Python中定義屬性的首選方法:property decorator或lambda?

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

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

你在哪裏見過這種「通過拉姆達的財產」,會讓你認爲它可能是「首選」?你有沒有看到很多這些?如果是這樣,在哪裏? – 2010-03-09 11:01:11

+0

@ S.Lott一些Python書,我不記得了。我將從現在開始使用裝飾器。沒問題。 :-) – parxier 2010-03-10 04:45:28

回答

21

的裝飾形式可能是最好的情況下,你已經證明,要打開方法爲只讀屬性。如果你想提供setter/deleter/docstring和getter,或者如果你想添加一個與其派生它的值的方法有不同名稱的屬性,第二種情況會更好。

+10

+1:請不要使用lambdas。請。 – 2010-03-09 11:00:15

+28

S.洛特 - 爲什麼不呢? (不爭論 - 只是好奇) – Yarin 2011-11-20 18:08:57

+0

@ S.Lott:好的,但是你的解決方法是什麼限制lambda不允許docstrings? – smci 2014-08-06 00:20:17

4

不要爲此使用lambdas。第一個是隻讀屬性可以接受的,第二個是與真實方法一起用於更復雜的情況。

49

因爲我使用裝飾只讀屬性,否則我通常會做這樣的事情:

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

更新:

最近的Python版本增強了裝飾方法:

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

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

使用此符號時,我使用flake8,pyflakes時出現錯誤。我重新定義了功能「優雅」的警告。 – Stephan 2012-09-24 10:08:25

+0

使用Pylint,使用裝飾器還有額外的好處。參見[Pylint警告'W0212'具有訪問受保護成員的屬性:如何避免?](http://stackoverflow.com/questions/24833362/pylint-warning-w0212-with-properties-accessing-a-protected-member-如何對avoi)。它保留了Pylint檢查返回值/對象的能力。 – Hibou57 2014-07-18 21:40:01