2013-02-24 17 views
5

Ben 'korumalı' erişimli Python 3.2 bir sınıf hiyerarşisi kurmak istiyoruz.Python'da "Korumalı" erişim - nasıl? temel sınıf üyeleri yalnızca türetilmiş sınıflar için kapsam olurdu, ama 'genel' değil:

çift alt çizgi üyesi 'özel', tek alt çizgi bir uyarı gösterir ama üye 'kamu' kalır yapar. Ne (varsa ...) 'korumalı' bir üye belirlemek için doğru sözdizimi. Python

+6

Yapamazsınız. '_single_underscore' kuralını kullanın ve mutlu olun. – JBernardo

cevap

8

Üye erişim ödeneği "müzakere" ve "antlaşma" değil zorla çalışır. Başka bir deyişle, sınıfınızın kullanıcısı işlerini yapmayan şeyleri elinden bırakmalıdır, ancak benim kullanımımın (normalde) uygun olmadığını açıkça belirten _xxx tanımlayıcılarını kullanamazsınız. .

+0

Yani bu mümkün değil. TAMAM. Fakat 'antlaşmalar' ile pek çok kez seslendiğim 'güçler' ile ilgili bir sorunum var: erişim belirleyicilerinin ardındaki fikir, diğer insanların bir şeyleri gerçekten yapmasını engellemekten başka bir şey değildir. Kodunuzun açık, yapılandırılmış organizasyonu hakkında. Dilimi BUNU YAPMAK İSTİYORUM, sık sık gördüğüm Python kodunda yaygın olan her türlü çılgın hack için açıklık bırakmayın. (Muhtemelen Python kullanmamam gerektiğini belirten ...) – Vector

3

Çift alt çizgi üyesi C++ 'özel' veya Java anlamı yok - Python oldukça açıkça dil zorlanan erişim kuralları bu tür uzak durur. Bu nedenle, işler dışında hala binebilirsek, ancak bu sınıf arabiriminin desteklenen bir parçası değildir ve - A tek alt çizgi, Kongre tarafından bir "uygulama ayrıntı" gibi bir özelliği veya yöntemi işaretler Sınıfın invaryantlar veya geri/ileri uyumluluğu ile ilgili sağlayabileceği garantiler artık geçerli değildir. Bu, aynı kavramsal problemi “özel” (arayüz ve uygulama ayrımı) olarak farklı bir şekilde çözer. -

Çift hâlâ 'özel' değil adı bozma çağırmak altını

o sayede, yukarıda sadece biraz daha güçlü bir formüldür: - Bu fonksiyon, ama bu sınıfın bir uygulama ayrıntıdır - Altsınıflar olabilir makul __name sınıfın adını içerecek şekilde karıştırılmış edilmesini sağlayan dil desteği biraz alır orijinal

bir geçersiz kılınmış sürümü olarak geliyordu olmadığını aynı adlı bir yöntemi var bekliyoruz - böylece alt sınıf sürümleri geçersiz kılmak yerine farklı adlar alır. ve Cendereleme hedefi bunu önlemek için açıkça değil - gerçekten istiyorsa bir alt sınıf veya dışında kod bu yöntemi çağırması da hala oldukça mümkündür.

Ama tüm bu nedenle

, 'korumalı' Python çok mantıklı değil çıkıyor - Eğer gerçekten bir gerçekçi bir alt sınıf tarafından çağrılan (ve sürece Invariants kırabilir yöntemi, muhtemelen don varsa Yaptığını düşünüyorsanız bile, Python Yolu sadece bunu belgelemek içindir. "Bu sadece alt sınıflar tarafından çağrılan varsayılır" ın etkisine dokunduğunuzda bir not koyun ve müşterilerin doğru şeyi yapacağı varsayımıyla çalıştırın - çünkü yapmazlarsa, kendi problemleri olur.

+0

'Çift alt çizgi C++ veya Java anlamında' özel 'üye yapmaz ...' - anlaşıldı. Bu yüzden tırnaklarda 'özel' dedim. Ama tazeleme için teşekkürler. – Vector

İlgili konular