Python bize bu gibi isme çift çizgi ekleyerek bu bir sınıf içinde 'özel' yöntem ve değişkenleri oluşturma olanağı verir: __myPrivateMethod()
. Öyleyse, kişi bunu nasıl açıklayabilir?
>>> class MyClass:
... def myPublicMethod(self):
... print 'public method'
... def __myPrivateMethod(self):
... print 'this is private!!'
...
>>> obj = MyClass()
>>> obj.myPublicMethod()
public method
>>> obj.__myPrivateMethod()
Traceback (most recent call last):
File "", line 1, in
AttributeError: MyClass instance has no attribute '__myPrivateMethod'
>>> dir(obj)
['_MyClass__myPrivateMethod', '__doc__', '__module__', 'myPublicMethod']
>>> obj._MyClass__myPrivateMethod()
this is private!!
Anlaşma ne?!
Bunu tam olarak anlamayanlar için biraz açıklayacağım.
>>> class MyClass:
... def myPublicMethod(self):
... print 'public method'
... def __myPrivateMethod(self):
... print 'this is private!!'
...
>>> obj = MyClass()
Yaptığım şey, ortak bir yöntem ve özel bir yöntemle bir sınıf oluşturmak ve örneklemek.
Sonra onun genel yöntemini çağırıyorum.
>>> obj.myPublicMethod()
public method
Sonra, kendi özel yöntemini deniyorum ve çağırıyorum.
>>> obj.__myPrivateMethod()
Traceback (most recent call last):
File "", line 1, in
AttributeError: MyClass instance has no attribute '__myPrivateMethod'
Burada her şey iyi görünüyor; onu arayamayız. Aslında 'özel'. Aslında öyle değil. Nesne üzerinde dir () komutu çalıştırıldığında , python'un tüm 'özel' yöntemleriniz için sihirli bir şekilde oluşturduğu yeni bir büyülü yöntem ortaya çıkar.
>>> dir(obj)
['_MyClass__myPrivateMethod', '__doc__', '__module__', 'myPublicMethod']
Bu yeni yöntemin adı her zaman bir alt çizgi, ardından sınıf adı ve ardından yöntem adıdır.
>>> obj._MyClass__myPrivateMethod()
this is private!!
Kapsülleme için çok mu, ha?
Her durumda, Python'un kapsüllemeyi desteklemediğini her zaman duymuştum, neden denesin ki? Ne oluyor?