SORU
12 EKİM 2009, PAZARTESİ


Yerleşik fonksiyon özelliği() python

Bunun dışında biraz sözdizimsel şeker için bana görünür, () özelliği iyi olan hiçbir şey yok.

Emin, güzel bir o a.b=2 yerine a.setB(2) ama gerçeği gizleyerek yazmak.b=2 basit bir görev değil a.b=2 gibi ya da beklenmedik bir sonuç olabilir, çünkü sorun için bir reçete, aslında a.b neden olur gibi görünüyor 1. Veya bir özel durum oluşturulur. Ya da performans sorunu. Ya da sadece kafa karıştırıcı.

Ben iyi bir kullanım için somut bir örnek verebilir misiniz? (yama sorunlu kod sayılmaz kullanarak ;-)

CEVAP
12 EKİM 2009, PAZARTESİ


Diller itimat alıcıları ve ayarlayıcıları, Java, onlar değil ne de beklenen bir şey yapmak için ama ne derler -- olur şaşırtıcı eğer x.getB() bir şey yaptım ama geri dönüş akım değeri mantıksal nitelik b x.setB(2) yaptığı bir şey ama neyse az miktarda iç çalışma gerekli x.getB() dönüş 2.

Ancak, dile getirilmiştirgaranti ederbu beklenen davranış, yani, derleyici tarafından uygulanan kısıtlamaları vücudun yöntemleri olan isimler start ile get set: bunun yerine, o, Sol, Yukarı, sağduyu, sosyal sözleşme, "stil kılavuzları", ve test.

Özellikleri içerir (ama Python kalmayan dilleri bir dizi) var mı hangi dilde x.b = 2 gibi x.b erişir ve atamaları davranıştırtam olarakörneğin, Java alıcı ve ayarlayıcı yöntemleri için aynı: aynı beklentiler, aynı eksikliği dil zorlanan garanti eder.

Özellikleri ilk galibiyetini sözdizimi ve okunabilirlik. Yazmak, örneğin, zorunda

x.setB(x.getB()   1)

aşikar olanı yerine

x.b  = 1

tanrılar için ağlıyor intikam. Özellikleri destekleyen dillerde, kesinlikle sınıf kullanıcılar bu tür Bizans demirbaş ve gyrations geçmesi için zorlamak için iyi bir neden, kendi kodlarını başka bir açıklaması olmaksızın okunabilirliği etkileyen bir şey yok.

Python özellikle bir tanesi var ki daha büyük Yukarı kullanarak özellikler (veya diğer tanımlayıcıları) yerine alıcıları ve ayarlayıcıları: Eğer ve ne zaman yeniden sınıf böylece temel belirleyici ve alıcı gerekli değildir, artık, (kırılma olmadan sınıfın yayınlanan API) sadece ortadan kaldırmak, bu yöntemleri ve bu özelliği kullanır bunları, yapma b normal bir "saklı" özniteliği x's sınıfı yerine "mantıklı" bir elde ve set hesaplama.

Python, işleri doğrudan (zaman uygulanabilir) yerine) yöntemleri önemli bir iyileştirme ve sistematik olarak kullanma özellikleri sağlar gerçekleştirmek için bu en iyi duruma getirme zaman mümkün (her zaman teşhir "normal depolanan öznitelikler" doğrudan ve sadece bunu yapmak gerekir hesaplama üzerine erişim ve/veya ayar) yöntemleri ve özellikleri).

Eğer özellikleri yerine alıcıları ve ayarlayıcıları kullanırsanız, kullanıcıların okunabilirlik' kodu . etkileyen çok ötesinde ^em>ayrıcagereksiz yere makine döngüleri israf (ve bu döngü sırasında onların bilgisayar giden enerji;-),yineiyi bir sebeple.

Sizin tek karşı argüman özellikleri vardır örneğin, "dışarıdan bir kullanıcı olmaz bekliyoruz herhangi bir yan etkisi sonucunda atama, genellikle"; ama seni özledim aslında aynı kullanıcı (bir dil gibi Java nereye alıcıları ve ayarlayıcıları olan yaygın) olmaz bekliyoruz (gözlemlenebilir) "yan etki" olarak çağıran bir pasör, ya da (ve daha da az bir alıcı;-). Makul beklentileri ve belirleyici ve alıcı kullanılan olup olmadığını size kalmış, sınıf yazar olarak, denemek ve onları karşılamak için doğrudan ya da üzerinden bir özelliği, hiç fark etmez. Eğer önemli gözlemlenebilir yan etkileri olan yöntemler varsa, yapındeğilonları getThis, setThat, adı ve özellikleri ile onları kullanmayın.

Şikayet özellikleri "uygulama" tamamen haksız oluyor . gizle ^em>tümOOP uygulama bilgileri -- bir sınıf dış dünya için mantıklı bir arayüz sunmakla görevli hale saklanıyor ve uygulama DAHİLİ olarak en iyisidir. Alıcıları ve ayarlayıcıları, tam olarak özellikleri gibi, bu amaca yönelik araçlardır. Özellikleri sadece daha iyi bir iş yapmak (onları destekleyen dillerde;-).

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • bobono1baby

    bobono1baby

    14 AĞUSTOS 2011
  • efaustus9

    efaustus9

    16 HAZİRAN 2006
  • RD

    RD

    19 NİSAN 2006