2012-02-04 13 views
14

Aynı sınıftaki diğer işlevlerden özel işlevi nasıl çağırabilirim? ne zaman bunu yapmakAynı sınıftaki özel işlev çağrısı python

class Foo: 
    def __bar(arg): 
    #do something 
    def baz(self, arg): 
    #want to call __bar 

Şu anda,:

NameError: global name '_Foo__createCodeBehind' is not defined 

birisi bana hata nedeni ne söyleyebilir: Baz dan

__bar(val) 

() i bu olsun? Ayrıca, başka bir özel işlevden özel bir işlevi nasıl arayabilirim?

cevap

18

Python'da C/C++ vb. Gibi bir örtük this-> yoktur. Bunu self numaralı telefondan aramak zorundasınız.

class Foo: 
    def __bar(self, arg): 
     #do something 
    def baz(self, arg): 
     self.__bar(arg) 

Bu yöntemler olsa gerçekten özel değildir. İki altçizgi ile bir metod ismini başlattığınızda, Python bunu "özel" yapan bir isim yapar ve hepsi budur, diğer diller gibi bir şeyi zorlamaz. Foo üzerinde __bar tanımladığınızda, Foo._Foo__bar aracılığıyla nesnenin dışından hala erişilebilir. Ör biri bunu yapabilirsiniz: Bu siz de var hata mesajında ​​"garip" tanımlayıcı açıklıyor

f = Foo() 
f._Foo__bar('a') 

.

here belgelerinde bulabilirsiniz.

5

__bar (Adından mangled olmuştur anlamda) "özel" olduğunu, ama yine de Foo bir yöntem, yani sen self yoluyla başvuru ve buna self geçmek zorunda. Sadece bir __bar() ile arayarak işe yaramaz; onu şöyle çağırmalısınız: self.__bar(). Yani ...

>>> class Foo(object): 
... def __bar(self, arg): 
...  print '__bar called with arg ' + arg 
... def baz(self, arg): 
...  self.__bar(arg) 
... 
>>> f = Foo() 
>>> f.baz('a') 
__bar called with arg a 

Her yerde Foo tanım içine self.__bar erişebilir, ancak tanımının dışında girince, foo_object._Foo__bar() kullanmak zorunda. Bu, sınıf devralma bağlamında ad alanı çakışmalarını önlemeye yardımcı olur. Bu özelliği kullanmamanın nedeni bu değilse, muhtemelen yanlış kullanıyorsunuzdur.