Python'da neden açık erişim değiştiricileri yok:


28

'Açıkça örtük olmaktan iyidir' ise, neden Python: Açık, Korumalı, Özel vb. Açık erişim değiştiricileri yok?

Bu fikrin, programcının bir ipucu ile ne yapacağını bilmesi gerektiği olduğunu biliyorum - 'kaba kuvvet' kullanmaya gerek yok. Ancak IMO 'Kapsülleme' veya 'bilgiyi gizleme' sadece insanları dışarıda tutmakla kalmaz, aynı zamanda bir organizasyon ve yapı meselesidir: gelişim katmanlarınız, tıpkı fiziksel sistemler gibi, kendini tanımlayan, açıkça sınırlandırılmış kapsam ve sınırlara sahip olmalıdır.

Birisi lütfen bana, aksi halde mükemmel görünebilecek bir dil olan Python'da açıkça değil, erişim kısıtlamalarının neden belirtildiği konusunda sağlam bir açıklama yaparak yardımcı olabilir mi?

Düzenleme: Şimdiye kadar 3 önerilen cevap gördüm ve sorumun 2 kısmı olduğunu anladım:

  1. Örneğin, neden anahtar kelimeler yok?

    private def myFunc(): 
        dostuff....

    IMO yerine çirkin ve alt çizgi yazmak zor. Ancak bu önemli nokta değil.

  2. Daha önemlisi:

    Bu erişim düzenleyicileri neden sadece 'öneri' ya da ipucu veriyor ve zorunlu değil. Daha sonra değiştirmek zor olacak mı? Korumalı olanı 'halka açık' olarak değiştirmek çok kolaydır - ve bunu zorlaştıran karmaşık bir kalıtım zincirine sahipseniz, zayıf bir tasarıma sahip olursunuz - tasarımınızı yazmayı kolaylaştıran bir dil özelliğine güvenmek yerine rafine edilmelidir kötü yapılandırılmış kod.

    Erişim düzenleyicileri zorlandığında, kodunuz otomatik olarak bölümlendirilir - belirli segmentlerin kapsam dışı olduğunu ve böylece gerekip gerekmediği zaman haricinde bunlarla uğraşmanıza gerek kalmayacağını BİLİNEBİLİRSİNİZ. Ve, tasarımınız iyi değilse ve kendinizi sürekli olarak farklı alanlara giren ve çıkan şeyleri bulursanız, dil, hareketlerinizi temizlemenize yardımcı olabilir.

Python'u sevdiğim kadar, bu noktayı ciddi bir eksiklik olarak görüyorum. Ve bunun için iyi bir cevap görmedim.


Python'da:: yapıcı olmadığı için kapatılan Erişim belirtecinin olası kopyası .
Frank Shearar

2
@Frank bu soruyu daha yapıcı olmaya çalışmak için tekrar sormaktır. Devam ettim ve orijinal soruyu sildim.

@Mark Trapp: Ah, Tamam. Açıklama için teşekkürler. Kapatmam için oyumu nasıl iptal edeceğimi bilemiyorum.
Frank Shearar

@Frank Kendi kendine yaşlanacaktır.
Adam Lear

sorun private def whateverşu ki, bunun class x: def whatever(self): passiçin bir kısayol class x: pass; x.whatever = lambda self: pass, temelde, atamak için özel bir değiştiriciye ihtiyacınız olacak
keppla

Yanıtlar:


22

"Açık, örtük olmaktan iyidir", Python'un tasarım felsefesindeki en üst düzeylerden sadece bir tanesidir. "Basit, karmaşıktan iyidir" de var. Ve Python Zeninde olmasa da, "Hepimiz yetişkinlere rıza gösteriyoruz" diğeri.

Bu ikinci kural belki de buradaki en önemli şey. Bir sınıf tasarlarken, nasıl kullanılacağı hakkında biraz fikrim var. Ancak olası tüm kullanımları tahmin edemiyorum. Bu olabilir kodumu bazıları ileride kullanımı Ben özel olarak düşündüm değişkenlerine erişim gerektirir ol. Gelecekteki bir programcının (hatta gelecekteki bir beynimin) ihtiyaç duyması durumunda, bunlara erişmeyi neden zorlaştırmalıyım - hatta olanaksızlaştırmalıyım? Yapılacak en iyi şey, onları bir uyarıyla işaretlemektir - Joonas'ın not ettiği gibi, tek bir alt çizgi öneki standarttır - içseldir ve değişebilir; ancak erişimi yasaklamak tamamen gereksiz görünüyor.


1
"Basit, karmaşık olandan daha iyidir" ve "Burada hepimiz yetişkinlere izin veriyoruz", Smalltalk'ın değiştiricilere erişiminin olmamasının nedenidir. Bir yöntemi "özel" kategoriye koymak, kullanmadan önce üç kez düşünmeniz gerektiğini düşündüğünüz bir ipucudur, artık yok.
Frank Shearar

@Frank: "" Özel "kategorisine bir yöntem koymak, kullanmadan önce üç kez düşünmeniz gerektiğini düşündüğünüz bir ipucu, ve daha fazlası yok" Bana göre, sadece işlem yapmadığımda endişelenmeme gerek yok Bununla.
Vektör

8
Özel üyelere erişimin yasaklanmasının iyi bir nedeni var: çünkü sınıf değişmeyenlerini kırabilir. Özel üyeler yazamıyorsanız, sınıfınızın doğru davrandığından emin olamazsınız.
12'de

7
“Gelecekteki bir programcı (hatta gelecekteki bir ben) onlara ihtiyaç duyuyorsa, bunlara erişmeyi neden zorlaştırmalıyım - hatta olanaksızlaştırmalıyım?” Çünkü tasarımın temel ilkelerinden biri arayüz (ne tür bir kod sağlar) ve uygulama (nasıl sağlar) arasındaki ayrımdır. Kapsülleme, kodun farklı kısımları arasındaki bağımlılıkları azaltarak kodun karmaşıklığını azaltmaya yarar. Bu nedenle, genel ve özel, yalnızca neyin gerekli olduğunu görmeye izin vererek kodu daha basit tutmak amacıyla kullanılır.
Giorgio

3
Daha fazla katlanamıyorum. Erişim düzenleyicileri, büyük yazılımdaki karmaşıklığı azaltmak için muhtemelen en iyi anlaşılan iki konseptin tanıtımını yapar: Enkapsülasyon ve Endişelerin Ayrılması. İkisinden hiçbirine hizmet etmemek, python'un iyi bir OOP dili olmadığı veya büyük bir yazılım oluşturmak için uygun olmadığı anlamına gelir ve bu konuda yanlış bir şey yoktur. Ancak, bu gibi özelliklerin yokluğunu, "Gerekmediğinde neden karmaşıklık eklesin?" sadece yanlış.
Daniel Shin

10

Eksik erişim düzenleyicilerinin temel sebebinin Sadelik olduğundan şüpheleniyordum.

Söylediğiniz gibi, insanları dışarıda tutmakla ilgili değil, örgütle ilgili, bu yüzden “özel” in temel amacı, api'nizin kullanıcılarına “lütfen buna bağlı kod yazmayın” mesajı göndermesidir.

'Kurallara göre, _x veya __x sınıf dışında kullanılmamalıdır' demek ciddiyetsizdir, ancak python'un dinamik nesne modelinde notasyon yazması bile zor olacaktır.

class ActiveRow(object):
    def __init__(self, **kwargs):
        for name, value in kwargs.items():
            setattr(self, name, value)

erişilebilirlik nasıl not edilir?

Sanırım, bu bir takas oldu. Bununla kesinlikle yaşayamazsanız, benzer bir soyutlama ve dinamiklik seviyesine sahip olan, ancak erişim değişikliğine izin veren bir nesne modeline sahip olan yakutu öneririm.


8
Bence bu doğru, ama IMO çok korkunç. Satış noktası olarak zerafet ve okunabilirliği kullanan bir dil için __method__ yazma oldukça iğrenç ve berraktır.
jiggy

2
konvansiyon değil, __x__“sihir” dir (yani operatör aşırı yüklenmesi, yinelenebilirlik vb. gibi dil entegrasyonunu sağlamak için çağrılan yöntemler). Konvansiyonudur _x.
keppla

6
Üzgünüm, hala kafamı Python etrafında alıyorum. Bunu sevmek için çok çalışıyorum ama bunun gibi şeyler biraz kayganlaşıyor. Özellikle şimdi bir yöntemin ne kadar alt çizgi olduğunu anlamam gerek. OP’nin görüşüne göre, açıkça değiştiricilerin daha net olacağı görülüyor. Sarsma harika, ama netliği bozamıyor. Kodu oluşturmak için 10 kat daha fazla çaba harcarsınız.
jiggy

2
Benim örneğim farklı alt çizgi sayıları göstermek istememişti, kullanımı __init__tesadüfi idi. Örnek, derleme zamanında bilinmeyen nesnenin bazı özelliklerini belirler, bu nedenle açık bir erişim değiştiricisi size yardımcı olmaz.
keppla

5
@jiggy: "Bundan hoşlanmaya çalışıyorum". 2 yıl denedim - sonra pes ettim. :-( Gerçek bir OOP dili gibi davranmak için hacklenmiş bir betik dili gibi görünüyor .. Python'da iyi tasarlanmış ve okunaklı, geniş ve karmaşık bir uygulama yazmayı hayal edemiyorum. o binadan daha kod koruyarak '. Basit OOP ve güvenli kavramlar yazın çılgın kesmek ve geçici çözümler gerektirir
Vector

8

Python sözleşmesi, korunan / özel üyeler için alt çizgi bir önek kullanmaktır.

Bitirilen bu sözleşme, sen üyenin doğrudan görürsünüz) 1 hariç erişim değiştiricileri kadar etkili aynıdır ismi siz) genel olması ya da olmasın, ve 2 olabilir gerçekten (bu haklı olabilir istiyorsanız "kapsülleme" kırmak örneğin testlerde, diğer bazı dillerde de = = daha fazla kod kullanmanız gerekir).

Sonuçta bu bir zevk meselesidir, ancak aynı şeyi (biraz daha esnek bir şekilde) özel anahtar kelimeler olmadan yapabiliyorsanız, dil daha küçük olacak ve kod daha özlü olacaktır, bu genellikle iyi bir şeydir.


2
“Özel anahtar kelimeler olmadan aynı şeyi (biraz daha esnek bir şekilde yapabiliyorsanız), dil daha küçük olacak ve kod daha kısa olacaktır” Bence bu genel olarak doğru değil. (Özel erişim değiştiricileri için geçerli olsa bile)
BenjaminB
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.