SORU
16 EYLÜL 2008, Salı


Neden Python'In 'gizli' yöntemler aslında özel değil mi?

Python bize yaratma yeteneği 'özel' adıyla ön yerleştirmeyi çift alt çizgi ile bir sınıf içinde yöntemler ve Değişkenler şöyle: __myPrivateMethod() verir. Peki, bu 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!!

Olay ne?!

Tam almamış olanlar için bu biraz anlatacağım.

>>> class MyClass:
...     def myPublicMethod(self):
...             print 'public method'
...     def __myPrivateMethod(self):
...             print 'this is private!!'
... 
>>> obj = MyClass()

Orada ne yaptığımı ortak bir yöntem ile bir sınıf ve özel bir yöntem oluşturmak ve oluşturmak.

Ardından, kamu yöntemi " diyorum.

>>> obj.myPublicMethod()
public method

Sonraki, ben denemek ve kendi özel yöntemi.

>>> obj.__myPrivateMethod()
Traceback (most recent call last):
  File "", line 1, in 
AttributeError: MyClass instance has no attribute '__myPrivateMethod'

Burada her şey yolunda görünüyor; çağrı kuramıyoruz. Aslında, 'özel'. Şey, aslında hiç de kolay değil. Çalışıyor() dirnesne üzerinde sihirli bir şekilde ortaya koymaktadır python için oluşturduğu yeni sihirli bir yöntem 'özel' yöntemleri.

>>> dir(obj)
['_MyClass__myPrivateMethod', '__doc__', '__module__', 'myPublicMethod']

Bu yeni yöntemin adı her zaman bir alt sınıf adı, yöntem adı tarafından izlenen.

>>> obj._MyClass__myPrivateMethod()
this is private!!

Saklama için çok fazla, değil mi?

Her durumda, her zaman duydum Python sarma, bu yüzden desteklemiyor neden bile deneyin? Ne veriyor?

CEVAP
16 EYLÜL 2008, Salı


Adı çabalıyorlar alt yanlışlıkla kendi superclasses özel yöntemler ve niteliklerini geçersiz kılma yok emin olmak için kullanılır. Dışarıdan kasıtlı erişimi engellemek için tasarlanmış değil.

Örneğin:

>>> class Foo(object):
...     def __init__(self):
...         self.__baz = 42
...     def foo(self):
...         print self.__baz
...     
>>> class Bar(Foo):
...     def __init__(self):
...         super(Bar, self).__init__()
...         self.__baz = 21
...     def bar(self):
...         print self.__baz
...
>>> x = Bar()
>>> x.foo()
42
>>> x.bar()
21
>>> print x.__dict__
{'_Bar__baz': 21, '_Foo__baz': 42}

Tabii ki, eğer iki farklı sınıf aynı ada sahip bozulur.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Apple&Tech Reviews & Giveaways

    Apple&Tech R

    12 Temmuz 2008
  • RawBrahs

    RawBrahs

    28 Aralık 2010
  • UrAvgConsumer

    UrAvgConsume

    1 Ocak 2012