Python adının ezilmesi


110

Diğer dillerde, daha iyi kod üretmeye yardımcı olan genel bir kılavuz her zaman her şeyi olabildiğince gizli yapmaktır. Bir değişkenin özel mi yoksa korumalı mı olacağı konusunda şüpheniz varsa, özel olarak gitmek daha iyidir.

Aynı şey Python için de geçerli mi? İlk başta her şeyde iki satır başı alt çizgi kullanmalı ve ihtiyaç duyduğumda onları yalnızca daha az gizli mi yapmalıyım (yalnızca bir alt çizgi)?

Konvansiyon yalnızca bir alt çizgi kullanacaksa, gerekçesini de bilmek isterim.

İşte JBernardo'nun cevabına bıraktığım bir yorum . Bu soruyu neden sorduğumu ve ayrıca neden Python'un diğer dillerden farklı olduğunu bilmek istediğimi açıklıyor:

Sizi her şeyin yalnızca ihtiyaç duyulduğu kadar halka açık olması gerektiğini ve daha fazlasını değil düşünmeniz için eğiten dillerden geliyorum. Gerekçe, bunun bağımlılıkları azaltacağı ve kodu değiştirmeyi daha güvenli hale getireceğidir. Bir şeyleri tersine yapmanın Python yolu - genelden başlayıp gizliye gitme - bana tuhaf geliyor.

Yanıtlar:


182

Şüpheye düştüğünüzde, "herkese açık" bırakın - Demek istediğim, niteliğinizin adını gizlemek için hiçbir şey eklemeyin. İçsel değeri olan bir sınıfınız varsa, onun için endişelenmeyin. Yazmak yerine:

class Stack(object):

    def __init__(self):
        self.__storage = [] # Too uptight

    def push(self, value):
        self.__storage.append(value)

bunu varsayılan olarak yazın:

class Stack(object):

    def __init__(self):
        self.storage = [] # No mangling

    def push(self, value):
        self.storage.append(value)

Bu kesinlikle bir şeyler yapmanın tartışmalı bir yoludur. Python'a yeni başlayanlar bundan nefret ediyor ve hatta bazı eski Python adamları bile bu varsayılanı küçümsüyor - ama yine de varsayılandır, bu yüzden rahatsız hissetseniz bile onu takip etmenizi gerçekten tavsiye ederim.

Eğer varsa gerçekten mesaj göndermek istiyorum "Dokunamazsın!" Kullanıcılarınız için olağan yöntem, değişkenin önüne bir alt çizgi koymaktır. Bu sadece bir sözleşmedir, ancak insanlar bunu anlar ve bu tür şeylerle uğraşırken çok dikkatli olurlar:

class Stack(object):

    def __init__(self):
        self._storage = [] # This is ok but pythonistas use it to be relaxed about it

    def push(self, value):
        self._storage.append(value)

Bu, özellik adları ile öznitelik adları arasındaki çakışmayı önlemek için de yararlı olabilir:

 class Person(object):
     def __init__(self, name, age):
         self.name = name
         self._age = age if age >= 0 else 0

     @property
     def age(self):
         return self._age

     @age.setter
     def age(self, age):
         if age >= 0:
             self._age = age
         else:
             self._age  = 0

Çift alt çizgi ne olacak? Çift alt çizgi sihri, esas olarak yöntemlerin yanlışlıkla aşırı yüklenmesini önlemek ve üst sınıfların nitelikleriyle ad çatışmalarını önlemek için kullanılır . Birçok kez uzatılması beklenen bir sınıf yazarsanız oldukça faydalı olabilir.

Başka amaçlar için kullanmak isterseniz, yapabilirsiniz, ancak bu ne normaldir ne de tavsiye edilir.

DÜZENLEME : Bu neden böyle? Normal Python stili, işleri özel kılmayı vurgulamıyor - tam tersine! Bunun pek çok nedeni var - çoğu tartışmalı ... Bazılarına bakalım.

Python'un özellikleri vardır

Günümüzde çoğu OO dili zıt yaklaşımı kullanmaktadır: kullanılmaması gerekenler görünür olmamalıdır, bu nedenle öznitelikler özel olmalıdır. Teorik olarak, bu daha yönetilebilir, daha az bağlantılı sınıflar sağlar, çünkü kimse nesnelerin içindeki değerleri pervasızca değiştirmez.

Ancak o kadar basit değil. Örneğin, Java sınıfları bir çok özelliklerini var ve sadece alıcılar almak değerleri ve sadece ayarlayıcıları set değerleri. Diyelim ki tek bir özniteliği bildirmek için yedi satırlık koda ihtiyacınız var - ki bir Python programcısı gereksiz yere karmaşık olduğunu söyler. Ayrıca, pratikte, bir genel alan elde etmek için bu kadar çok kod yazarsınız, çünkü alıcıları ve ayarlayıcıları kullanarak değerini değiştirebilirsiniz.

Öyleyse neden bu varsayılan olarak özel politikayı takip etmelisiniz? Özniteliklerinizi varsayılan olarak herkese açık hale getirin. Elbette, bu Java'da sorunludur, çünkü özniteliğinize bazı doğrulama eklemeye karar verirseniz, hepsini değiştirmeniz gerekir.

person.age = age;

kodunuzda, diyelim ki

person.setAge(age);

setAge() olmak:

public void setAge(int age) {
    if (age >= 0) {
        this.age = age;
    } else {
        this.age = 0;
    }
}

Yani Java'da (ve diğer dillerde), varsayılan olan, yine de alıcıları ve ayarlayıcıları kullanmaktır, çünkü yazmak için can sıkıcı olabilir, ancak kendinizi anlattığım durumda bulursanız size çok zaman ayırabilir.

Ancak, Python'un özellikleri olduğu için bunu Python'da yapmanıza gerek yoktur. Bu sınıfa sahipseniz:

 class Person(object):
     def __init__(self, name, age):
         self.name = name
         self.age = age

ve sonra yaşları doğrulamaya karar verirseniz person.age = age, kodunuzun parçalarını değiştirmenize gerek kalmaz . Bir mülk eklemeniz yeterlidir (aşağıda gösterildiği gibi)

 class Person(object):
     def __init__(self, name, age):
         self.name = name
         self._age = age if age >= 0 else 0

     @property
     def age(self):
         return self._age

     @age.setter
     def age(self, age):
         if age >= 0:
             self._age = age
         else:
             self._age  = 0

Yapabiliyorsanız ve yine de kullanabiliyorsanız person.age = age, neden özel alanlar, alıcılar ve ayarlayıcılar eklemelisiniz?

(Ayrıca, Python Java değildir ve alıcı ve ayarlayıcı kullanmanın zararları hakkındaki bu makaleye bakın .).

Her şey zaten görünür - ve saklamaya çalışmak sadece işinizi zorlaştırır

Özel niteliklerin olduğu dillerde bile, onlara bir tür yansıma / iç gözlem kitaplığı aracılığıyla erişebilirsiniz. Ve insanlar bunu çerçeveler içinde ve acil ihtiyaçları çözmek için çok yapıyor. Sorun, iç gözlem kitaplıklarının, genel niteliklerle yapabileceklerinizi yapmanın sadece zor bir yolu olmasıdır.

Python çok dinamik bir dil olduğundan, bu yükü sınıflarınıza eklemek ters etki yaratır.

Sorun görmek mümkün olmak değildir - ediliyor gerekli görmek için

Bir Pythonista için kapsülleme, sınıfların içlerini görme yetersizliği değil, ona bakmaktan kaçınma olasılığıdır. Demek istediğim, kapsülleme, kullanıcının dahili ayrıntılarla ilgilenmeden kullanılmasına izin veren bir bileşenin özelliğidir. Bir bileşeni, uygulama konusunda kendinizi rahatsız etmeden kullanabiliyorsanız, kapsüllenir (bir Python programcısının görüşüne göre).

Şimdi, sınıfınızı bu şekilde yazdıysanız, uygulama detaylarını düşünmek zorunda kalmadan kullanabiliyorsanız, herhangi bir sebepten dolayı sınıfın içine bakmak isterseniz sorun yok . Önemli olan şu: API'niz iyi olmalı ve gerisi ayrıntılar.

Guido öyle dedi

Bu tartışmalı değil: aslında öyle dedi . ("Açık kimono" yu arayın.)

Bu kültür

Evet, bazı nedenler var, ancak kritik bir neden yok. Bu çoğunlukla Python'da programlamanın kültürel bir yönüdür. Açıkçası, başka bir yol da olabilir - ama öyle değil. Ayrıca, bunun tersini de kolayca sorabilirsiniz: Neden bazı diller varsayılan olarak özel öznitelikleri kullanıyor? Python uygulamasıyla aynı ana nedenden ötürü: çünkü bu, bu dillerin kültürüdür ve her seçimin avantajları ve dezavantajları vardır.

Zaten bu kültür var olduğu için, onu takip etmeniz tavsiye edilir. Aksi takdirde, __Stack Overflow'da bir soru sorduğunuzda Python programcılarının size kodu kodunuzdan kaldırmanızı söylemesinden rahatsız olacaksınız :)


1. Kapsülleme, sınıf değişmezlerini korumak içindir. Gereksiz detayları dış dünyadan saklamamak can sıkıcı olur çünkü. 2. "Önemli olan şu: API'niz iyi olmalı ve gerisi ayrıntılar." Bu doğru. Ve genel öznitelikler API'nizin parçasıdır. Ayrıca, bazen genel ayarlayıcılar uygundur (sınıf değişmezlerinizle ilgili olarak) ve bazen değildirler. Herkese açık olmaması gereken genel ayarlayıcılara sahip bir API (değişmezlerin ihlali riski) kötü bir API'dir. Bu, her ayarlayıcının görünürlüğünü her halükarda düşünmeniz gerektiği anlamına gelir ve bir 'varsayılan'a sahip olmak daha az anlam ifade eder.
Jüpiter

21

Birincisi - İsim değiştirme nedir?

Adı bozma bir sınıf tanımı ve kullanımda olduğunda çağrılır __any_nameya da __any_name_olduğu, iki çizgi arka gelen çizgi (veya daha fazla) ve en fazla bir.

class Demo:
    __any_name = "__any_name"
    __any_other_name_ = "__any_other_name_"

Ve şimdi:

>>> [n for n in dir(Demo) if 'any' in n]
['_Demo__any_name', '_Demo__any_other_name_']
>>> Demo._Demo__any_name
'__any_name'
>>> Demo._Demo__any_other_name_
'__any_other_name_'

Şüphe duyduğunuzda ne yapmalı?

Görünen kullanım, alt sınıfların, sınıfın kullandığı bir özniteliği kullanmasını önlemektir.

Olası bir değer, davranışı geçersiz kılmak isteyen alt sınıflarla ad çarpışmalarından kaçınmaktır, böylece üst sınıf işlevselliği beklendiği gibi çalışmaya devam eder. Bununla birlikte, Python belgelerindeki örnek Liskov ile ikame edilemez ve bunu yararlı bulduğum hiçbir örnek aklıma gelmez.

Dezavantajları, bir kod tabanını okumak ve anlamak için bilişsel yükü artırmasıdır ve özellikle de kaynakta çift alt çizgi adını ve hata ayıklayıcıda karışık bir adı gördüğünüzde hata ayıklama yaparken.

Benim kişisel yaklaşımım kasıtlı olarak bundan kaçınmaktır. Çok büyük bir kod tabanı üzerinde çalışıyorum. Nadir kullanımları ağrılı bir başparmak gibi öne çıkıyor ve haklı görünmüyor.

Onun farkında olmanız gerekir ki, gördüğünüzde onu bilirsiniz.

PEP 8

Python standart kitaplık stili kılavuzu PEP 8 şu anda (kısaltılmış) diyor ki:

Kullanımıyla ilgili bazı tartışmalar var __names.

Sınıfınızın alt sınıflara alınması amaçlanıyorsa ve alt sınıfların kullanmasını istemediğiniz özniteliklere sahipseniz, bunları çift satır başı alt çizgi ile ve sonunda alt çizgi olmadan adlandırmayı düşünün.

  1. Karışık adda yalnızca basit sınıf adının kullanıldığına dikkat edin, bu nedenle bir alt sınıf hem aynı sınıf adını hem de öznitelik adını seçerse, yine de ad çakışmaları alabilirsiniz.

  2. Ad değiştirme, hata ayıklama gibi belirli kullanımları __getattr__()daha az kolay hale getirebilir . Bununla birlikte, ad değiştirme algoritması iyi belgelenmiştir ve manuel olarak gerçekleştirilmesi kolaydır.

  3. Herkes isim ezmeyi sevmez. Yanlışlıkla isim çatışmalarını önleme ihtiyacını gelişmiş arayanlar tarafından potansiyel kullanımla dengelemeye çalışın.

O nasıl çalışır?

Bir sınıf tanımının başına iki alt çizgi eklerseniz (çift alt çizgiyi sonlandırmadan), ad karıştırılır ve nesnenin başına sınıf adının ardından bir alt çizgi eklenir:

>>> class Foo(object):
...     __foobar = None
...     _foobaz = None
...     __fooquux__ = None
... 
>>> [name for name in dir(Foo) if 'foo' in name]
['_Foo__foobar', '__fooquux__', '_foobaz']

Adların yalnızca sınıf tanımı çözümlendiğinde karıştırılacağını unutmayın:

>>> Foo.__test = None
>>> Foo.__test
>>> Foo._Foo__test
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: type object 'Foo' has no attribute '_Foo__test'

Ayrıca, Python'da yeni olanlar bazen bir sınıf tanımında tanımlanmış gördükleri bir ada manuel olarak erişemediklerinde neler olduğunu anlamakta güçlük çekerler. Bu, buna karşı güçlü bir neden değil, ancak öğrenen bir kitleniz varsa dikkate alınması gereken bir şey.

Bir Alt Çizgi?

Konvansiyon yalnızca bir alt çizgi kullanacaksa, gerekçesini de bilmek isterim.

Niyetim, kullanıcıların bir öznitelikten uzak durması olduğunda, yalnızca bir alt çizgiyi kullanma eğilimindeyim, ancak bunun nedeni, benim zihinsel modelimde, alt sınıfların isme erişimi olacaktı (ki her zaman sahip oldukları, çünkü yine de karıştırılmış isim).

__Öneki kullanan kodu gözden geçiriyor olsaydım, neden ad değiştirme çağrısında bulunduklarını ve tek bir alt çizgiyle aynı şekilde yapamazlarsa, alt sınıfların sınıf için aynı adları seçtiğini ve sınıf özniteliği buna rağmen bir isim çakışması olacaktır.


16

Pratik yapmanın daha iyi kod ürettiğini söylemem. Görünürlük değiştiriciler sizi yalnızca elinizdeki görevden uzaklaştırır ve bir yan etki olarak arayüzünüzü istediğiniz gibi kullanılmaya zorlar. Genel olarak konuşursak, görünürlüğü zorunlu kılmak, programcıların belgeleri düzgün bir şekilde okumamaları halinde işleri karıştırmasını engeller.

Çok daha iyi bir çözüm, Python'un teşvik ettiği yoldur: Sınıflarınız ve değişkenleriniz iyi belgelenmeli ve davranışları net olmalıdır. Kaynak mevcut olmalıdır. Bu, kod yazmanın çok daha genişletilebilir ve güvenilir bir yoludur.

Python'daki stratejim şudur:

  1. Sadece lanet şeyi yazın, verilerinizin nasıl korunması gerektiği konusunda hiçbir varsayımda bulunmayın. Bu, problemleriniz için ideal arayüzleri oluşturmak için yazdığınızı varsayar.
  2. Bu şeyler için önde gelen bir alt çizgi kullanın muhtemelen harici olarak kullanılmayacak ve normal "istemci kodu" arayüzünün parçası olmayan .
  3. Çift alt çizgiyi yalnızca sınıf içinde tamamen uygun olan veya kazara maruz kalırsa önemli hasara neden olacak şeyler için kullanın.

Her şeyden önce, her şeyin ne yaptığı açık olmalıdır. Başka biri kullanacaksa belgeleyin. Bir yıl içinde faydalı olmasını istiyorsanız belgeleyin.

Bir yan not olarak, aslında diğer dillerde korumalı olarak gitmelisiniz: Sınıfınızın daha sonra miras alınabileceğini ve ne için kullanılabileceğini asla bilemezsiniz. Yalnızca yabancı kod tarafından kullanılamayacağından veya kullanılmaması gerektiğinden emin olduğunuz değişkenleri korumak en iyisidir.


9

Özel verilerle başlamamalı ve gerektiğinde herkese açık hale getirmemelisiniz. Bunun yerine, nesnenizin arayüzünü bulmakla başlamalısınız. Yani, dünyanın ne gördüğünü (halka açık şeyleri) bulmakla başlamalı ve sonra bunun olması için hangi özel şeylerin gerekli olduğunu bulmalısınız.

Diğer bir dil, bir zamanlar halka açık olanı özel kılmayı zorlaştırır. Yani değişkenimi özel veya korumalı yaparsam çok sayıda kodu kırarım. Ancak python'daki özelliklerde durum böyle değil. Aksine, dahili verileri yeniden düzenlerken bile aynı arayüzü koruyabilirim.

_ Ve __ arasındaki fark, python'un aslında ikincisini zorlama girişiminde bulunmasıdır. Tabii ki, gerçekten zorlamıyor ama zorlaştırıyor. Diğer programcılara sadece niyetin ne olduğunu söylemekle, tehlikeleri göz ardı etmekte özgürdürler. Ancak bu kuralı görmezden gelmek bazen yardımcı olabilir. Örnekler arasında hata ayıklama, geçici kesmeler ve sizin kullandığınız şekilde kullanılması amaçlanmayan üçüncü taraf koduyla çalışma yer alır.


6

Buna halihazırda pek çok iyi cevap var, ama bir tane daha önereceğim. Bu aynı zamanda kısmen çift alt çizginin özel olmadığını söyleyen kişilere verilen bir cevaptır (gerçekten öyle).

Java / C # 'a bakarsanız, her ikisinin de özel / korumalı / genel vardır. Bunların tümü derleme zamanı yapılarıdır . Yalnızca derleme sırasında uygulanırlar. Java / C # 'da yansıma kullanacaksanız, özel yönteme kolayca erişebilirsiniz.

Artık Python'da bir işlevi her çağırdığınızda, doğası gereği yansıma kullanıyorsunuz. Bu kod parçaları Python'da aynıdır.

lst = []
lst.append(1)
getattr(lst, 'append')(1)

"Nokta" sözdizimi, sonraki kod parçası için yalnızca sözdizimsel şekerdir. Çoğunlukla getattr kullanmak zaten tek bir işlev çağrısıyla çirkin olduğu için. Oradan daha da kötüleşiyor.

Bu özelliği ve orada olamaz Python kodunu derlemek olmadığı için, özel bir Java / C # versiyonu. Java ve C #, bir işlevin çalışma zamanında özel mi yoksa genel mi olduğunu kontrol edemez, çünkü bu bilgiler gitmiştir (ve işlevin nereden çağrıldığına dair hiçbir bilgisi yoktur).

Şimdi bu bilgilerle, çift alt çizginin adının karıştırılması "özelliğe" ulaşmak için en mantıklı olanıdır. Şimdi bir işlev 'self' örneğinden çağrıldığında ve '__' ile başladığını fark ettiğinde, sadece adı karıştırmayı gerçekleştirir. Bu sadece daha fazla sözdizimsel şeker. Bu sözdizimsel şeker, yalnızca veri üyesi erişimi için yansıma kullanan bir dilde "özel" e eşdeğer olmasına izin verir.

Sorumluluk reddi: Python geliştirmesinden kimsenin böyle bir şey söylediğini hiç duymadım. "Özel" olmamasının gerçek nedeni kültüreldir, ancak çoğu komut dosyası / yorumlanmış dilin özel olmadığını da fark edeceksiniz. Kesin olarak uygulanabilir bir özel, derleme zamanı dışında hiçbir şey için pratik değildir.


4

İlk olarak: Verilerinizi neden gizlemek istiyorsunuz? Bu neden bu kadar önemli?

Çoğu zaman gerçekten yapmak istemiyorsunuz ama yapıyorsunuz çünkü diğerleri yapıyor.

Eğer gerçekten gerçekten gerçekten bir şey kullanarak insanları istemiyorsanız, eklemek tane , önüne alt çizgi . İşte bu kadar ... Pythonistler, bir alt çizgiye sahip şeylerin her seferinde çalışmasının garanti edilmediğini ve siz bilmeden değişebilir.

Bu bizim yaşama şeklimiz ve bizde sorun yok.

İki alt çizgi kullanmak, sınıfınızın alt sınıflara ayrılmasını o kadar kötü hale getirecek ki, siz bile bu şekilde çalışmak istemeyeceksiniz.


2
Çift alt çizginin alt sınıflandırma için kötü olmasının nedenini atladınız ... bu, cevabınızı iyileştirecektir.
Matt Joiner

2
Çift alt çizginin gerçekten sadece alt sınıflarla isim çakışmalarını önlemek için olduğu düşünüldüğünde (alt sınıflara "elden" demenin bir yolu olarak), adın karıştırılmasının nasıl bir sorun yarattığını anlamıyorum.
Aaron Hall

4

Seçilen cevap, özelliklerin özel niteliklere olan ihtiyacı nasıl ortadan kaldırdığını açıklamakta iyi bir iş çıkarır , ancak modül seviyesindeki fonksiyonların özel yöntemlere olan ihtiyacı ortadan kaldırdığını da ekleyeceğim .

Bir yöntemi modül düzeyinde bir işleve dönüştürürseniz, alt sınıfların onu geçersiz kılma fırsatını kaldırmış olursunuz. Bazı işlevleri modül düzeyine taşımak, isim değiştirme ile yöntemleri gizlemeye çalışmaktan daha fazla Pythonictir.


3

Aşağıdaki kod parçacığı tüm farklı durumları açıklayacaktır:

  • baştaki iki alt çizgi (__a)
  • tek baştaki alt çizgi (_a)
  • alt çizgi yok (a)

    class Test:
    
    def __init__(self):
        self.__a = 'test1'
        self._a = 'test2'
        self.a = 'test3'
    
    def change_value(self,value):
        self.__a = value
        return self.__a

Test Nesnesinin tüm geçerli özelliklerini yazdırmak

testObj1 = Test()
valid_attributes = dir(testObj1)
print valid_attributes

['_Test__a', '__doc__', '__init__', '__module__', '_a', 'a', 
'change_value']

Burada, bu değişkenin alt sınıflardan herhangi biri tarafından geçersiz kılınmasını önlemek için __a adının _Test__a olarak değiştirildiğini görebilirsiniz. Bu kavram, python'da "İsim Mangling" olarak bilinir. Buna şu şekilde erişebilirsiniz:

testObj2 = Test()
print testObj2._Test__a

test1

Benzer şekilde, _a durumunda, değişken sadece geliştiriciye o sınıfın dahili değişkeni olarak kullanılması gerektiğini bildirmek içindir, python yorumlayıcısı ona erişseniz bile hiçbir şey yapmayacaktır, ancak bu iyi bir uygulama değildir.

testObj3 = Test()
print testObj3._a

test2

bir değişken, herkese açık bir sınıf değişkeni gibi herhangi bir yerden erişilebilir.

testObj4 = Test()
print testObj4.a

test3

Umarım cevap size yardımcı olmuştur :)


2

İlk bakışta diğer dillerle aynı olmalıdır ("diğer" altında Java veya C ++ demek istiyorum), ama değil.

Java'da, dışarıdan erişilemeyen tüm değişkenleri özel yaptınız. Aynı zamanda Python'da "özellik" olmadığı için bunu başaramazsınız (Python ilkelerinden birinin dediği gibi - "Hepimiz yetişkiniz"). Dolayısıyla, çift alt çizgi yalnızca "Çocuklar, bu alanı doğrudan kullanmayın" anlamına gelir. Aynı anlam, tek bir alt çizgiye sahiptir, bu aynı zamanda, dikkate alınan sınıftan miras almanız gerektiğinde herhangi bir baş ağrısına neden olmaz (sadece çift alt çizginin neden olduğu olası soruna bir örnek).

Bu nedenle, "özel" üyeler için varsayılan olarak tek alt çizgi kullanmanızı tavsiye ederim.


"Özel" için çift alt çizgi ve "korumalı" için tek alt çizgi kullanın. Genellikle, insanlar her şey için sadece tek alt çizgi kullanır (çift alt çizgi, genellikle Python stiline aykırı olan özelliğin uygulanmasına yardımcı olur).
Jonathan Sternberg

1
Ancak bu, iki alt çizgiyi özele ve bir alt çizgiyi korumalı olana benzer yapmaz mı? Neden "özel" den başlamıyorsun?
Paul Manta

@Paul Hayır, değil. Python'da özel yoktur ve bunu başarmaya çalışmamalısınız.
Roman Bodnarchuk

@Roman Kavramsal olarak ... 'özel' ile ilgili alıntılara dikkat edin.
Paul Manta

1

"Bir değişkenin özel mi yoksa korumalı mı olacağı konusunda şüpheniz varsa, özel olarak gitmek daha iyidir." - evet, aynı Python'da da geçerlidir.

Buradaki bazı cevaplar 'konvansiyonlar' hakkında söyler, ancak bu konvansiyonlara bağlantı vermez. Python için yetkili kılavuz, PEP 8 açıkça belirtmektedir:

Şüpheniz varsa, kamuya açık olmayanları seçin; daha sonra bunu herkese açık hale getirmek, genel bir özniteliği herkese açık hale getirmekten daha kolaydır.

Genel ve özel arasındaki ayrım ve Python'da isim değiştirme diğer cevaplarda ele alınmıştır. Aynı bağlantıdan

Burada "özel" terimini kullanmıyoruz, çünkü Python'da hiçbir nitelik gerçekten özel değildir (genellikle gereksiz miktarda çalışma olmadan).


-2

# Python adı değiştirme İÇİN ÖRNEK PROGRAM

class Demo:
    __any_name = "__any_name"
    __any_other_name_ = "__any_other_name_"


[n for n in dir(Demo) if 'any' in n]   # GIVES OUTPUT AS ['_Demo__any_name', 
                                       #    '_Demo__any_other_name_']

1
Bu soruya hiç cevap vermiyor - bir örnek gösteriyor ama asıl sorunun özüne inmiyor. Bu ve bu soru neredeyse 9 yaşında ve kabul edilmiş bir cevap. Bu, burada verilen cevaplara herhangi bir şey ekler mi?
rayryeng
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.