2012-02-04 48 views
14

Làm cách nào để gọi hàm riêng tư từ một số hàm khác trong cùng một lớp?Gọi hàm riêng tư trong cùng một trăn lớp

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

Ngay bây giờ, khi tôi làm điều này:

__bar(val) 

từ baz(), tôi có được điều này:

NameError: global name '_Foo__createCodeBehind' is not defined 

Ai đó có thể cho tôi biết những gì lý do của lỗi được? Ngoài ra, làm cách nào tôi có thể gọi chức năng riêng tư từ một chức năng riêng tư khác?

Trả lời

18

Không có ẩn nào this-> bằng Python như bạn có trong C/C++ v.v. Bạn phải gọi số này theo số self.

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

Những phương pháp này không thực sự tin mặc dù. Khi bạn bắt đầu một tên phương thức với hai dấu gạch dưới, Python thực hiện một số tên mangling để làm cho nó "riêng tư" và đó là tất cả, nó không thực thi bất cứ thứ gì giống như các ngôn ngữ khác. Nếu bạn xác định __bar trên Foo, nó vẫn có thể truy cập từ bên ngoài của đối tượng thông qua Foo._Foo__bar. Ví dụ: người ta có thể làm điều này:

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

Điều này giải thích số nhận dạng "lẻ" trong thông báo lỗi bạn nhận được.

Bạn có thể tìm thấy nó here trong tài liệu.

5

__bar là "private" (theo nghĩa là tên gọi của nó đã được mangled), nhưng nó vẫn là một phương pháp Foo, vì vậy bạn phải tham khảo nó qua self và vượt qua self với nó. Chỉ cần gọi nó với một trần __bar() sẽ không hoạt động; bạn phải gọi nó là: self.__bar(). Vì vậy, ...

>>> 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 

Bạn có thể truy cập vào self.__bar bất cứ nơi nào trong phạm vi định nghĩa Foo của bạn, nhưng một khi bạn đang ở bên ngoài các định nghĩa, bạn phải sử dụng foo_object._Foo__bar(). Điều này giúp tránh va chạm không gian tên trong ngữ cảnh thừa kế lớp. Nếu đó không phải là lý do bạn sử dụng tính năng này, có thể bạn đang sử dụng tính năng này không chính xác.

Các vấn đề liên quan