2010-03-09 23 views
32

Python'da sınıf özelliklerini tanımlamanın tercih edilen yolu nedir ve neden? Her iki sınıfta da kullanmak doğru mudur?Python'da özellik tanımlamanın tercih edilen yolu: özellik dekoratörü veya lambda?

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

veya

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

Bu "mülkiyeti lambda üzerinden" gördünüz mü, "tercih" olabileceğini düşünmenize neden olacak? Bunların çoğunu gördün mü? Öyleyse nerede? –

+0

@ S.Lott Bazı python kitapları, hatırlamıyorum. Şu andan itibaren dekoratörler kullanacağım. Sorun değil. :-) – parxier

cevap

21

dekoratör formu salt okunur bir özellik haline yöntemi çevirmek istediğiniz yeri, gösterdiğin durumda muhtemelen en iyisidir. İkinci durum, bir setter/deleter/docstring yanı sıra getter sağlamak istediğinizde ya da onun değerini türetir yöntemine farklı bir adı olan bir özellik eklemek istiyorsanız daha iyidir.

+10

+1: Lütfen lambdaları kullanmayın. Lütfen. –

+28

S.Lott - neden olmasın? (Sadece merak etmemek-meraklı) – Yarin

+0

@ S.Lott: tamam ama lambda'ların sınırlamalarına ne gibi bir çözüm var? – smci

4

Bunun için lambda kullanmayın. İlk bir salt okunur özellik için kabul edilebilir, ikincisi daha karmaşık durumlar için gerçek yöntemlerle kullanılır. Başka Genellikle böyle bir şey yapmak Ben dekoratör kullanmak salt okunur özellikleri için

49

:

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

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

Son versiyonları dekoratör yaklaşımı geliştirilmiş: güncelleme

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

+2

Bu notasyonu kullanırken flake8, pyflakes kullanırken hata alıyorum. Fonksiyonun 'zarif' uyarılarını yeniden tanımladım. – Stephan

+0

Pylint ile, dekoratörün kullanılması için ek bir avantaj vardır. Korunan bir üyeye erişen özelliklere sahip [W0212 'uyarı mesajı: bkz. Nasıl önlenir?] (Http://stackoverflow.com/questions/24833362/pylint-warning-w0212-with-properties-accessing-a-protected-member- nasıl yapılır-avoi). Pylint'in döndürülen değeri/nesneyi kontrol etme yeteneğini korur. – Hibou57

İlgili konular